#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define f first
#define s second
#define pii pair<int,int>
#define ppii pair<int,pii>
#define vi vector<int>
#define pb push_back
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define F(n) for(int i=0;i<n;i++)
#define lb lower_bound
#define ub upper_bound
#define fastio ios::sync_with_stdio(false);cin.tie(NULL);
#pragma GCC optimize ("03,unroll-lopps")
#define sz(x) (int)((x).size())
#define int long long
using namespace std;
const int mod=1e9+7,mxn=2e3+10,inf=1e18,minf=-1e18,lg=20,Mxn=1e6;
//#undef int
int n,k,m,d,q;
void setIO(string name){
	ios_base::sync_with_stdio(0); cin.tie(0);
	freopen((name+".in").c_str(),"r",stdin);
	freopen((name+".out").c_str(),"w",stdout);
}
int gcd2(int x,int y){
	if(x<y)swap(x,y);
	while(y){
		x%=y;
		swap(x,y);
	}
	return x;
}
struct fraction{
	// A / B
	int A=0,B=1;
	void reduce(){
		int x=gcd2(A,B);
		A/=x;
		B/=x;
	}
	void operator-=(fraction &o){
		if(o.B==B){
			A-=o.A;
		}
		else{
			A*=o.B;
			A-=(o.A*B);
			B*=o.B;
		}
		reduce();
	}
	void operator+=(fraction &o){
		if(o.B==B){
			A+=o.A;
		}
		else{
			A*=o.B;
			A+=(o.A*B);
			B*=o.B;
		}
		reduce();
	}
	fraction operator+(fraction &o){
		fraction x;
		x.A=A;
		x.B=B;
		x+=o;
		return x;
	}
	fraction operator-(fraction &o){
		fraction x;
		x.A=A;
		x.B=B;
		x-=o;
		return x;
	}
	fraction operator/(fraction &o){
		fraction x;
		x.A=A;
		x.B=B;
		x.A*=o.B;
		x.B*=o.A;
		x.reduce();
		return x;
	}
	fraction operator*(fraction &o){
		fraction x;
		x.A=A;
		x.B=B;
		x.A*=o.A;
		x.B*=o.B;
		x.reduce();
		return x;
	}
	int cmp(fraction &y)const{
		if(A*y.B<y.A*B)return -1;
		else if(A*y.B>y.A*B)return 1;
		return 0;
	}
	bool operator<=(fraction &o)const{return cmp(o)<=0;}
	bool operator==(fraction &o)const{return cmp(o)==0;}
	bool operator>=(fraction &o)const{return cmp(o)>=0;}
};
fraction v[mxn+10][mxn+10];
fraction o[mxn+10][mxn+10];
fraction need[mxn+10];
fraction sum[mxn+10];
int P[mxn+10];
int dead[mxn+10];
int32_t main(){
	fastio
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>v[i][j].A;
			o[i][j].A=v[i][j].A;
			need[i].A+=v[i][j].A;
		}
		P[i]=1;
		need[i].B=n;
	}
	vector<int>ord;
	int last=0;
	fraction L;
	int cur=1;
	vector<pii>ans;
	for(int k=0;k<n;k++){
		pair<pair<int,fraction>,int>choose;
		choose.f.f=inf;
		choose.s=inf;
		for(int i=1;i<=n;i++){
			if(dead[i])continue;
			while(P[i]<=m&&sum[i]+v[i][P[i]]<=need[i]){
				sum[i]+=v[i][P[i]];
				P[i]++;
			}
			fraction x=need[i]-sum[i];
			if(P[i]==m+1&&x.A){
				cout<<-1;
				return 0;
			}
			x=(x/o[i][P[i]]);
			//x = ratio of taken P[i]
			//we take everything til P[i]-1
			//when we take something completely we update del->take O(L*N)
			//else we take parts of it only happen once per k take O(N) to update
			if(P[i]<choose.f.f)choose={{P[i],x},i};
			else if(P[i]==choose.f.f&&x<=choose.f.s)choose={{P[i],x},i};
		}
		if(k==n-1)break;
		fraction x=choose.f.s;
		while(cur<choose.f.f){
			for(int i=1;i<=n;i++){
				if(P[i]>cur)sum[i]-=v[i][cur];
				v[i][cur].A=0;
			}
			cur++;
		}
		for(int i=1;i<=n;i++){
			fraction sub=(x*o[i][cur]);
			if(P[i]>cur)sum[i]-=sub;
			v[i][cur]-=sub;
		}
		//1+1/15
		if(choose.f.f>last){
			last=choose.f.f;
			L=x;
		}
		else if(choose.f.f==last)L+=x;
		ans.pb({(last-1)*L.B+L.A,L.B});
		ord.pb(choose.s);
		dead[choose.s]=1;
	}
	for(auto i:ans)cout<<i.f<<" "<<i.s<<'\n';
	for(int i=1;i<=n;i++)if(!dead[i])ord.pb(i);
	for(auto i:ord)cout<<i<<" ";
}
/*
*/
컴파일 시 표준 에러 (stderr) 메시지
naan.cpp:16:40: warning: bad option '-funroll-lopps' to pragma 'optimize' [-Wpragmas]
   16 | #pragma GCC optimize ("03,unroll-lopps")
      |                                        ^
naan.cpp:23:23: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   23 | void setIO(string name){
      |                       ^
naan.cpp:28:21: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   28 | int gcd2(int x,int y){
      |                     ^
naan.cpp:39:21: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   39 |         void reduce(){
      |                     ^
naan.cpp:44:36: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   44 |         void operator-=(fraction &o){
      |                                    ^
naan.cpp:55:36: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   55 |         void operator+=(fraction &o){
      |                                    ^
naan.cpp:66:39: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   66 |         fraction operator+(fraction &o){
      |                                       ^
naan.cpp:73:39: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   73 |         fraction operator-(fraction &o){
      |                                       ^
naan.cpp:80:39: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   80 |         fraction operator/(fraction &o){
      |                                       ^
naan.cpp:89:39: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   89 |         fraction operator*(fraction &o){
      |                                       ^
naan.cpp:98:29: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   98 |         int cmp(fraction &y)const{
      |                             ^~~~~
naan.cpp:103:37: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
  103 |         bool operator<=(fraction &o)const{return cmp(o)<=0;}
      |                                     ^~~~~
naan.cpp:104:37: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
  104 |         bool operator==(fraction &o)const{return cmp(o)==0;}
      |                                     ^~~~~
naan.cpp:105:37: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
  105 |         bool operator>=(fraction &o)const{return cmp(o)>=0;}
      |                                     ^~~~~
naan.cpp:113:14: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
  113 | int32_t main(){
      |              ^
naan.cpp: In function 'void setIO(std::string)':
naan.cpp:25:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   25 |         freopen((name+".in").c_str(),"r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
naan.cpp:26:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   26 |         freopen((name+".out").c_str(),"w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |