#include<bits/stdc++.h>
typedef long long ll;
#define pb push_back
#define fr first
#define sc second
#define endl '\n'
using namespace std;
#define mid ((left+right)>>1)
#define int ll
int n,m;
int sum[2023];
int arr[2023][2023];
pair<int,int>ans[2023];
vector<int>v;
int gcd(int x,int y){
if(x<y)swap(x,y);
if(!y)return x;
return gcd(y,x%y);
}
void print(__int128_t x){
if(x<0){
cerr<<"-";
x=-x;
}
if(x>9)print(x/10);
cerr<<int(x%10);
}
signed main(){
ios_base::sync_with_stdio(23^23);cin.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>arr[i][j];
sum[i]+=arr[i][j];
arr[i][j]+=arr[i][j-1];
}
}
pair<int,int>pos={0,1};
for(int j=1;j<=n;j++){
int opt=0;
pair<__int128_t,int>nex={m+1,1};
for(int i=1;i<=n;i++){
if(ans[i].fr)continue;
int bas=pos.fr/pos.sc+1;
int l=bas,r=m;
while(l<r){
int mi=(l+r)/2;
__int128_t o=arr[i][bas]-arr[i][bas-1];
__int128_t p1=pos.sc-(pos.fr%pos.sc);
__int128_t p2=pos.sc;
__int128_t x=arr[i][mi]-arr[i][bas];
if(__int128_t(o*p1+x*p2)*n>=sum[i]*p2)r=mi;
else l=mi+1;
}
__int128_t x=arr[i][l-1]-arr[i][bas];
__int128_t p1=pos.sc-(pos.fr%pos.sc),p2=pos.sc;
__int128_t t=arr[i][l]-arr[i][l-1],o=arr[i][bas]-arr[i][bas-1];
pair<__int128_t,int>can={sum[i]*p2-x*n*p2-o*n*p1,n*t*p2};
can.fr+=__int128_t(l-1)*can.sc;
int g=gcd(can.fr,can.sc);
can.fr/=g;
can.sc/=g;
if(nex.fr*can.sc>can.fr*nex.sc){
opt=i;
nex.fr=can.fr;nex.sc=can.sc;
}
}
if(nex.sc>1e7){
__int128_t x=(nex.fr*10000000ll)/nex.sc+1;
while(!(x*nex.sc>=nex.fr*10000000))cerr<<"??????????";
nex.fr=x;
nex.sc=1e7;
}
int g=gcd(nex.fr,nex.sc);
nex.fr/=g;
nex.sc/=g;
if(nex.fr>m*nex.sc){
while(true)cerr<<"**********";
}
pos=ans[opt]=nex;
v.pb(opt);
}
pair<int,int>la={0,1};
for(int i=1;i<=n;i++){
pair<int,int>me=ans[v[i-1]];
int a=la.fr/la.sc+1;
int b=me.fr/me.sc+1;
int x=arr[v[i-1]][b-1]-arr[v[i-1]][a];
int p1=la.sc-(la.fr%la.sc),p2=la.sc;
int l1=(me.fr%me.sc),l2=me.sc;
int o=arr[v[i-1]][a]-arr[v[i-1]][a-1],t=arr[v[i-1]][b]-arr[v[i-1]][b-1];
if((o*p1*l2+x*p2*l2+l1*t*p2)*n<sum[v[i-1]]*p2*l2){
cerr<<v[i-1]<<" ";
assert(0);
}
}
int las=v.back();
//if((ans[las].fr/double(ans[las].sc))>5)cerr<<(ans[las].fr/double(ans[las].sc))<<endl;
v.pop_back();
for(int x:v){
cout<<ans[x].fr<<" "<<ans[x].sc<<endl;
}
v.pb(las);
for(int i=1;i<=n;i++){
cout<<v[i-1]<<" ";
}
cout<<endl;
}