#include <bits/stdc++.h>
#define FNAME "hungarian"
using namespace std;
typedef long long ll;
const int MAXN = (int)1e3 + 5;
const int LIM = (int)1e6 + 1;
const long long MOD = (long long)1e13 + 15092007;
#define xd '\n'
#define pii pair<int, int>
#define pll pair<long long, long long>
#define pli pair<long long, int>
#define fi first
#define se second
const long long base = (long long)256;
const long long INF = (long long)1e18;
template<class X, class Y> bool minimize(X &a, Y b) {if(a>b){a=b;return true;}return false;};
template<class X, class Y> bool maximize(X &a, Y b) {if(a<b){a=b;return true;}return false;};
void HuuThien() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
if (fopen(FNAME".inp", "r")) {
freopen(FNAME".inp", "r", stdin);
freopen(FNAME".out", "w", stdout);
}
}
int n, m;
vector<vector<long long>> grid;
struct Hungarian{
int nX, nY;
vector<int> matchU, matchV;
vector<long long> slack;
vector<long long> lx, ly;
bool visX[MAXN], visY[MAXN];
Hungarian(int N, int M) {
nX = N, nY = M;
matchU.assign(nX + 1, 0);
matchV.assign(nY + 1, 0);
slack.assign(nY + 1, INF);
lx.assign(nX + 1, 0);
ly.assign(nY + 1, 0);
}
bool dfs(int u) {
visX[u] = true;
for(int v = 1; v <= nY ; v++) {
if(visY[v]) continue;
long long delta = lx[u] + ly[v] - grid[u][v];
if(delta == 0) {
visY[v] = true;
if(!matchV[v] or dfs(matchV[v])) {
matchV[v] = u;
matchU[u] = v;
return true;
}
} else {
slack[v] = min(slack[v], delta);
}
}
return false;
}
void Solve() {
for(int u = 1; u <= nX ; u++) {
for(int v = 1; v <= nY; v++) {
lx[u] = max(lx[u], grid[u][v]);
}
}
for(int u = 1; u <= nX ; u++) {
for(int v = 1; v <= nY; v++) {
slack[v] = INF;
}
while(true) {
memset(visX, false, sizeof(visX));
memset(visY, false, sizeof(visY));
if(dfs(u)) break;
long long delta = INF;
for(int v = 1; v <= nY ; v++) {
if(!visY[v]) {
delta = min(delta, slack[v]);
}
}
for(int u = 1; u <= nX ; u++) {
if(visX[u]) {
lx[u] -= delta;
}
}
for(int v = 1; v <= nY; v++) {
if(visY[v]) {
ly[v] += delta;
} else {
slack[v] -= delta;
}
}
}
}
}
void getMatch() {
long long res = 0;
for(int v = 1; v <= nY ; v++) {
if(matchV[v]) {
res += grid[matchV[v]][v];
}
}
cout << res << xd;
for(int u = 1; u <= nX ; u++) {
cout << u << " " << matchU[u] << xd;
}
}
};
void Init() {
cin >> n >> m;
grid.assign(n + 1, vector<long long>(m + 1, 0));
for(int i = 1; i <= n ; i++) {
for(int j = 1; j <= m ; j++) {
cin >> grid[i][j];
}
}
}
void Solve() {
Hungarian Mbappe(n, m);
Mbappe.Solve();
Mbappe.getMatch();
}
signed main() {
HuuThien();
Init();
Solve();
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgRk5BTUUgImh1bmdhcmlhbiIKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdHlwZWRlZiBsb25nIGxvbmcgbGw7CmNvbnN0IGludCBNQVhOID0gKGludCkxZTMgKyA1Owpjb25zdCBpbnQgTElNID0gKGludCkxZTYgKyAxOwpjb25zdCBsb25nIGxvbmcgTU9EID0gKGxvbmcgbG9uZykxZTEzICsgMTUwOTIwMDc7CiNkZWZpbmUgeGQgJ1xuJwojZGVmaW5lIHBpaSBwYWlyPGludCwgaW50PgojZGVmaW5lIHBsbCBwYWlyPGxvbmcgbG9uZywgbG9uZyBsb25nPgojZGVmaW5lIHBsaSBwYWlyPGxvbmcgbG9uZywgaW50PgojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCmNvbnN0IGxvbmcgbG9uZyBiYXNlID0gKGxvbmcgbG9uZykyNTY7CmNvbnN0IGxvbmcgbG9uZyBJTkYgPSAobG9uZyBsb25nKTFlMTg7CnRlbXBsYXRlPGNsYXNzIFgsIGNsYXNzIFk+IGJvb2wgbWluaW1pemUoWCAmYSwgWSBiKSB7aWYoYT5iKXthPWI7cmV0dXJuIHRydWU7fXJldHVybiBmYWxzZTt9Owp0ZW1wbGF0ZTxjbGFzcyBYLCBjbGFzcyBZPiBib29sIG1heGltaXplKFggJmEsIFkgYikge2lmKGE8Yil7YT1iO3JldHVybiB0cnVlO31yZXR1cm4gZmFsc2U7fTsKCnZvaWQgSHV1VGhpZW4oKSB7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOwogICAgY2luLnRpZSgwKTsgY291dC50aWUoMCk7CiAgICBpZiAoZm9wZW4oRk5BTUUiLmlucCIsICJyIikpIHsKICAgICAgICBmcmVvcGVuKEZOQU1FIi5pbnAiLCAiciIsIHN0ZGluKTsKICAgICAgICBmcmVvcGVuKEZOQU1FIi5vdXQiLCAidyIsIHN0ZG91dCk7CiAgICB9IAp9CgppbnQgbiwgbTsKdmVjdG9yPHZlY3Rvcjxsb25nIGxvbmc+PiBncmlkOwoKc3RydWN0IEh1bmdhcmlhbnsKICAgIGludCBuWCwgblk7CiAgICB2ZWN0b3I8aW50PiBtYXRjaFUsIG1hdGNoVjsKICAgIHZlY3Rvcjxsb25nIGxvbmc+IHNsYWNrOwogICAgdmVjdG9yPGxvbmcgbG9uZz4gbHgsIGx5OwogICAgYm9vbCB2aXNYW01BWE5dLCB2aXNZW01BWE5dOwoKCiAgICBIdW5nYXJpYW4oaW50IE4sIGludCBNKSB7CiAgICAgICAgblggPSBOLCBuWSA9IE07CiAgICAgICAgbWF0Y2hVLmFzc2lnbihuWCArIDEsIDApOwogICAgICAgIG1hdGNoVi5hc3NpZ24oblkgKyAxLCAwKTsKICAgICAgICBzbGFjay5hc3NpZ24oblkgKyAxLCBJTkYpOwogICAgICAgIGx4LmFzc2lnbihuWCArIDEsIDApOwogICAgICAgIGx5LmFzc2lnbihuWSArIDEsIDApOwogICAgfQoKICAgIGJvb2wgZGZzKGludCB1KSB7CiAgICAgICAgdmlzWFt1XSA9IHRydWU7CgogICAgICAgIGZvcihpbnQgdiA9IDE7IHYgPD0gblkgOyB2KyspIHsKICAgICAgICAgICAgaWYodmlzWVt2XSkgY29udGludWU7CgogICAgICAgICAgICBsb25nIGxvbmcgZGVsdGEgPSBseFt1XSArIGx5W3ZdIC0gZ3JpZFt1XVt2XTsKICAgICAgICAgICAgaWYoZGVsdGEgPT0gMCkgewogICAgICAgICAgICAgICAgdmlzWVt2XSA9IHRydWU7CiAgICAgICAgICAgICAgICBpZighbWF0Y2hWW3ZdIG9yIGRmcyhtYXRjaFZbdl0pKSB7CiAgICAgICAgICAgICAgICAgICAgbWF0Y2hWW3ZdID0gdTsKICAgICAgICAgICAgICAgICAgICBtYXRjaFVbdV0gPSB2OwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc2xhY2tbdl0gPSBtaW4oc2xhY2tbdl0sIGRlbHRhKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHZvaWQgU29sdmUoKSB7CiAgICAgICAgZm9yKGludCB1ID0gMTsgdSA8PSBuWCA7IHUrKykgewogICAgICAgICAgICBmb3IoaW50IHYgPSAxOyB2IDw9IG5ZOyB2KyspIHsKICAgICAgICAgICAgICAgIGx4W3VdID0gbWF4KGx4W3VdLCBncmlkW3VdW3ZdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yKGludCB1ID0gMTsgdSA8PSBuWCA7IHUrKykgewogICAgICAgICAgICBmb3IoaW50IHYgPSAxOyB2IDw9IG5ZOyB2KyspIHsKICAgICAgICAgICAgICAgIHNsYWNrW3ZdID0gSU5GOwogICAgICAgICAgICB9CgogICAgICAgICAgICB3aGlsZSh0cnVlKSB7CiAgICAgICAgICAgICAgICBtZW1zZXQodmlzWCwgZmFsc2UsIHNpemVvZih2aXNYKSk7CiAgICAgICAgICAgICAgICBtZW1zZXQodmlzWSwgZmFsc2UsIHNpemVvZih2aXNZKSk7CgogICAgICAgICAgICAgICAgaWYoZGZzKHUpKSBicmVhazsKCiAgICAgICAgICAgICAgICBsb25nIGxvbmcgZGVsdGEgPSBJTkY7CgogICAgICAgICAgICAgICAgZm9yKGludCB2ID0gMTsgdiA8PSBuWSA7IHYrKykgewogICAgICAgICAgICAgICAgICAgIGlmKCF2aXNZW3ZdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gbWluKGRlbHRhLCBzbGFja1t2XSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGZvcihpbnQgdSA9IDE7IHUgPD0gblggOyB1KyspIHsKICAgICAgICAgICAgICAgICAgICBpZih2aXNYW3VdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGx4W3VdIC09IGRlbHRhOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBmb3IoaW50IHYgPSAxOyB2IDw9IG5ZOyB2KyspIHsKICAgICAgICAgICAgICAgICAgICBpZih2aXNZW3ZdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGx5W3ZdICs9IGRlbHRhOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNsYWNrW3ZdIC09IGRlbHRhOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICB2b2lkIGdldE1hdGNoKCkgewogICAgICAgIGxvbmcgbG9uZyByZXMgPSAwOwoKICAgICAgICBmb3IoaW50IHYgPSAxOyB2IDw9IG5ZIDsgdisrKSB7CiAgICAgICAgICAgIGlmKG1hdGNoVlt2XSkgewogICAgICAgICAgICAgICAgcmVzICs9IGdyaWRbbWF0Y2hWW3ZdXVt2XTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgY291dCA8PCByZXMgPDwgeGQ7CiAgICAKICAgICAgICBmb3IoaW50IHUgPSAxOyB1IDw9IG5YIDsgdSsrKSB7CiAgICAgICAgICAgIGNvdXQgPDwgdSA8PCAiICIgPDwgbWF0Y2hVW3VdIDw8IHhkOwogICAgICAgIH0KICAgIH0KfTsKCnZvaWQgSW5pdCgpIHsKICAgIGNpbiA+PiBuID4+IG07CiAgICBncmlkLmFzc2lnbihuICsgMSwgdmVjdG9yPGxvbmcgbG9uZz4obSArIDEsIDApKTsKCiAgICBmb3IoaW50IGkgPSAxOyBpIDw9IG4gOyBpKyspIHsKICAgICAgICBmb3IoaW50IGogPSAxOyBqIDw9IG0gOyBqKyspIHsKICAgICAgICAgICAgY2luID4+IGdyaWRbaV1bal07CiAgICAgICAgfQogICAgfQp9Cgp2b2lkIFNvbHZlKCkgewogICAgSHVuZ2FyaWFuIE1iYXBwZShuLCBtKTsKCiAgICBNYmFwcGUuU29sdmUoKTsKICAgIE1iYXBwZS5nZXRNYXRjaCgpOwp9CgpzaWduZWQgbWFpbigpIHsKICAgIEh1dVRoaWVuKCk7CiAgICBJbml0KCk7CiAgICBTb2x2ZSgpOwp9Cg==