#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;

#define pb push_back
typedef long long ll;

const int nmax=200010;

tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> ost;

int mas[nmax]={0},cnt[nmax]={0},nd[410][410]={0};
vector<int> op,vc[410][410];

int main()
{
    //ios_base::sync_with_stdio(0);
    //cin.tie(0);
    int n,m;
    cin >> n >> m;
    for(int i=1;i<=n*m;i++) {
        cin >> mas[i];
    }
    bool flag=0;
    for(int i=1;i<=n*m;i+=m) {
        for(int j=1;j<=m;j++) {
            cnt[j]=0;
        }
        for(int j=i;j<i+m;j++) {
            cnt[mas[j]]++;
            if(cnt[mas[j]]>1) {
                vc[(i-1)/m][mas[j]].pb(j);
                flag=1;
            }
        }
        for(int j=1;j<=m;j++) {
            if(cnt[j]==0) {
                nd[j][(i-1)/m]=1;
            }
        }
    }
    if(flag==0) {
        cout << "0\n";
    }
    op.pb(n*m+1);
    flag=0;
    for(int i=0;i<n;i++) {
        for(int j=1;j<=m;j++) {
            if(vc[i][j].size()) {
                op.pb(vc[i][j].back());
                swap(mas[n*m+1],mas[vc[i][j].back()]);
                vc[n][mas[n*m+1]].pb(n*m+1);
                vc[i][j].pop_back();
                flag=1;
                break;
            }
        }
        if(flag) {
            break;
        }
    }
    int cur,t,tr;
    while(op.back()!=n*m+1) {
        cur=op.back();
        t=(cur-1)/m;
        for(int i=1;i<=m;i++) {
            if(nd[i][t]==1) {
                tr=i;
            }
        }
        flag=0;
        for(int i=0;i<=n;i++) {
            for(int j=1;j<=m;j++) {
                if(vc[i][j].size() && nd[mas[vc[i][j].back()]][t]) {
                    swap(mas[vc[i][j].back()],mas[cur]);
                    nd[mas[cur]][t]=0;
                    op.pb(vc[i][j].back());
                    vc[i][j].pop_back();
                    flag=1;
                    break;
                }
            }
            if(flag) {
                break;
            }
        }
    }
    cout << op.size()-1 << "\n";
    for(int i=1;i<op.size();i++) {
        cout << op[i] << " " << op[i-1] << "\n";
    }
    return 0;
}
