#include <bits/stdc++.h>
#include <iostream>
using namespace std;
int main(){
long long n, m;
cin >> n >> m;
vector<long long> max_ember(m); // hany ember jatszhat egy szerepet
for(auto &x : max_ember){
cin >> x;
}
vector<long long> valasztotta(n); // ki mit valasztott
for(auto &x : valasztotta){
cin >> x;
x--;
}
vector<long long> sir(n); // ki mennyit sir
for(auto &x : sir){
cin >> x;
}
// beolvasás vége
vector<vector<long long>> akar(m, vector<long long>()); // melyik szerepet kik akarják
for(long long i = 0; i < n; i++){
akar[valasztotta[i]].push_back(i);
}
// elorebb kell-e legyen a, mint b?
// siras szerint novekvo sorrendbe
auto akar_ember_rendezo_comp = [&](long long a, long long b){
return sir[a] < sir[b];
};
// !! PRIORITY_QUEUE-nál ez pont fordítva van
vector<long long> aktDb(m);
for(long long i = 0; i < m; i++){
sort(akar[i].begin(), akar[i].end(), akar_ember_rendezo_comp);
aktDb[i] = akar[i].size();
}
// szereprendezésre
vector<long long> index(m);
for(long long i = 0; i < m; i++){
index[i] = i;
}
auto extra_hely = [&](long long szerep_ind){
return max_ember[szerep_ind] - aktDb[szerep_ind];
};
vector<long long> vegso(n, -1);
vector<long long> elsok(m, 0); // akar tombon belul az elso rakhato indexe egy adott szerepre
auto atrak = [&](long long regi_szerep, long long uj_szerep_ind){
long long ember_ind = akar[regi_szerep][elsok[regi_szerep]];
assert(vegso[ember_ind] == -1);
aktDb[regi_szerep]--;
vegso[ember_ind] = uj_szerep_ind;
aktDb[uj_szerep_ind]++;
elsok[regi_szerep]++;
};
// végigmegyünk minden nullason es rakunk bele olyant, aki tulfolyna
long long ind = 0;
for(long long i = m-1; i >= 0; i--){
while(ind < m && extra_hely(ind) >= 0) ind++;
if(ind == m) break;
if(aktDb[i] != 0) continue;
atrak(ind, i);
}
vector<long long> nem_egyedul;
for(long long i = 0; i < n; i++){
if(vegso[i] == -1 && aktDb[valasztotta[i]] > 1){
nem_egyedul.push_back(i);
}
}
sort(nem_egyedul.begin(), nem_egyedul.end(), akar_ember_rendezo_comp);
// végigmegyünk az osszes nullason es rakunk bele barkit, aki nem egyedul van
ind = 0; // most emberek indexei a nem_egyedulben
for(long long i = m-1; i >= 0; i--){
if(aktDb[i] != 0) continue;
while(aktDb[valasztotta[nem_egyedul[ind]]] <= 1) ind++;
atrak(valasztotta[nem_egyedul[ind]], i);
ind++;
}
for(int i = 0; i < m; i++){
assert(aktDb[i] != 0);
}
// itt mar jok a nullasok
// a extra hely szerint novekvobe rendezi
auto index_rend = [&](long long a, long long b){
return extra_hely(a) < extra_hely(b);
};
// elvileg a nullasok keszen vannak, mostmar csak a sirokkal kell kezdeni valamit
sort(index.begin(), index.end(), index_rend);
ind = m-1;
for(long long i = 0; i < m; i++){
long long akt_i = index[i];
long long akt_ind = index[ind];
while(extra_hely(akt_i) < 0){
while(extra_hely(akt_ind) <= 0){
ind--;
akt_ind = index[ind];
}
atrak(akt_i, akt_ind);
}
}
long long vegso_siras = 0;
for(long long i = 0; i < n; i++){
vegso_siras += (vegso[i] != -1) * sir[i];
}
cout << vegso_siras << "\n";
for(long long i = 0; i < n; i++){
cout << (vegso[i] != -1 ? vegso[i] : valasztotta[i])+1 << " ";
}
cout << "\n";
}