#include<bits/stdc++.h>
#pragma GCC optimize("Ofast,inline,unroll-loops")
#define rep(a,b,c) for(ll a=b;a<=c;++a)
#define per(a,b,c) for(ll a=b;a>=c;--a)
#define ll long long
#define ff first
#define ss second
#define mp make_pair
using namespace std;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
const ll N=2005,inf=1e18;
struct frac{
ll x,y;
frac(){}
frac(ll x,ll y):x(x),y(y){}
bool operator<(const frac &o){
return x*o.y<o.x*y;
}
}R[N][N];
ll n,L,V[N][N],P[N];
bitset<N> flag;
signed main(){
ios::sync_with_stdio(0);cin.tie(0);
cin>>n>>L;
rep(i,1,n) rep(j,1,L) cin>>V[i][j];
rep(i,1,n){
ll ptr=1,cur=0,tot=0;
rep(j,1,L) tot+=V[i][j];
rep(j,1,n-1){
while(frac(cur+V[i][ptr],1)<frac(tot*j,n)) cur+=V[i][ptr],ptr++;
R[i][j]=frac(tot*j-cur*n,n*V[i][ptr]);
}
R[i][n]=frac(L,1);
}
rep(i,1,n){
ll mn=0;
rep(j,1,n) if(!flag[j]) if(mn==0||R[j][i]<R[mn][i]) mn=j;
flag[mn]=1;
P[i]=mn;
}
rep(i,1,n-1) cout<<R[P[i]][i].x<<' '<<R[P[i]][i].y<<'\n';
rep(i,1,n) cout<<P[i]<<' ';
cout<<'\n';
return 0;
}