// ~~ icebear love atttt ~~
#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9 + 7;
const int N = 1000 + 5;
int A[N][N];
int n, m;
// https://c...content-available-to-author-only...s.com/graph/hungarian-algorithm.html#the-mathcalon3-algorithm
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> n >> m;
assert(n <= m);
for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++)
cin >> A[i][j], A[i][j] = -A[i][j];
vector<int> u (n+1), v (m+1), p (m+1), way (m+1);
for (int i=1; i<=n; ++i) {
p[0] = i;
int j0 = 0;
vector<int> minv (m+1, INF);
vector<bool> used (m+1, false);
do {
used[j0] = true;
int i0 = p[j0], delta = INF, j1;
for (int j=1; j<=m; ++j)
if (!used[j]) {
int cur = A[i0][j]-u[i0]-v[j];
if (cur < minv[j])
minv[j] = cur, way[j] = j0;
if (minv[j] < delta)
delta = minv[j], j1 = j;
}
for (int j=0; j<=m; ++j)
if (used[j])
u[p[j]] += delta, v[j] -= delta;
else
minv[j] -= delta;
j0 = j1;
} while (p[j0] != 0);
do {
int j1 = way[j0];
p[j0] = p[j1];
j0 = j1;
} while (j0);
}
vector<int> ans(n + 1);
for(int j = 1; j <= m; j++) ans[p[j]] = j;
cout << v[0] << '\n';
for(int i = 1; i <= n; i++) cout << ans[i] << ' ';
return 0;
}
Ly8gfn4gaWNlYmVhciBsb3ZlIGF0dHR0IH5+CiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgaW50IElORiA9IDFlOSArIDc7CmNvbnN0IGludCBOID0gMTAwMCArIDU7CmludCBBW05dW05dOwppbnQgbiwgbTsKLy8gaHR0cHM6Ly9jLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5zLmNvbS9ncmFwaC9odW5nYXJpYW4tYWxnb3JpdGhtLmh0bWwjdGhlLW1hdGhjYWxvbjMtYWxnb3JpdGhtCmludCBtYWluKCkgewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsKICAgIGNpbi50aWUoMCk7IGNvdXQudGllKDApOwogICAgY2luID4+IG4gPj4gbTsKICAgIGFzc2VydChuIDw9IG0pOwogICAgZm9yKGludCBpID0gMTsgaSA8PSBuOyBpKyspIGZvcihpbnQgaiA9IDE7IGogPD0gbTsgaisrKQogICAgICAgIGNpbiA+PiBBW2ldW2pdLCBBW2ldW2pdID0gLUFbaV1bal07CgogICAgdmVjdG9yPGludD4gdSAobisxKSwgdiAobSsxKSwgcCAobSsxKSwgd2F5IChtKzEpOwogICAgZm9yIChpbnQgaT0xOyBpPD1uOyArK2kpIHsKICAgICAgICBwWzBdID0gaTsKICAgICAgICBpbnQgajAgPSAwOwogICAgICAgIHZlY3RvcjxpbnQ+IG1pbnYgKG0rMSwgSU5GKTsKICAgICAgICB2ZWN0b3I8Ym9vbD4gdXNlZCAobSsxLCBmYWxzZSk7CiAgICAgICAgZG8gewogICAgICAgICAgICB1c2VkW2owXSA9IHRydWU7CiAgICAgICAgICAgIGludCBpMCA9IHBbajBdLCAgZGVsdGEgPSBJTkYsICBqMTsKICAgICAgICAgICAgZm9yIChpbnQgaj0xOyBqPD1tOyArK2opCiAgICAgICAgICAgICAgICBpZiAoIXVzZWRbal0pIHsKICAgICAgICAgICAgICAgICAgICBpbnQgY3VyID0gQVtpMF1bal0tdVtpMF0tdltqXTsKICAgICAgICAgICAgICAgICAgICBpZiAoY3VyIDwgbWludltqXSkKICAgICAgICAgICAgICAgICAgICAgICAgbWludltqXSA9IGN1ciwgIHdheVtqXSA9IGowOwogICAgICAgICAgICAgICAgICAgIGlmIChtaW52W2pdIDwgZGVsdGEpCiAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gbWludltqXSwgIGoxID0gajsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChpbnQgaj0wOyBqPD1tOyArK2opCiAgICAgICAgICAgICAgICBpZiAodXNlZFtqXSkKICAgICAgICAgICAgICAgICAgICB1W3Bbal1dICs9IGRlbHRhLCAgdltqXSAtPSBkZWx0YTsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBtaW52W2pdIC09IGRlbHRhOwogICAgICAgICAgICBqMCA9IGoxOwogICAgICAgIH0gd2hpbGUgKHBbajBdICE9IDApOwogICAgICAgIGRvIHsKICAgICAgICAgICAgaW50IGoxID0gd2F5W2owXTsKICAgICAgICAgICAgcFtqMF0gPSBwW2oxXTsKICAgICAgICAgICAgajAgPSBqMTsKICAgICAgICB9IHdoaWxlIChqMCk7CiAgICB9CgogICAgdmVjdG9yPGludD4gYW5zKG4gKyAxKTsKICAgIGZvcihpbnQgaiA9IDE7IGogPD0gbTsgaisrKSBhbnNbcFtqXV0gPSBqOwogICAgY291dCA8PCB2WzBdIDw8ICdcbic7CiAgICBmb3IoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgY291dCA8PCBhbnNbaV0gPDwgJyAnOwogICAgcmV0dXJuIDA7Cn0KCg==