This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define pb push_back
#define all(v) ((v).begin(), (v).end())
#define sortv(v) sort(all(v))
#define sz(v) ((int)(v).size())
#define uniqv(v) (v).erase(unique(all(v)), (v).end())
#define umax(a, b) (a)=max((a), (b))
#define umin(a, b) (a)=min((a), (b))
#define FOR(i,a,b) for(int i = (a); i <= (b); i++)
#define rep(i,n) FOR(i,1,n)
#define rep0(i,n) FOR(i,0,(int)(n)-1)
#define FI first
#define SE second
#define INF 2000000000
#define INFLL 1000000000000000000LL
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int MAX_N = 2000;
ll N, L;
ll arr[MAX_N+1][MAX_N+1];
ll sum[MAX_N+1];
vector<pll> vt[MAX_N+1];
bool vst[MAX_N+1];
vector<pll> ans;
vector<int> ans2;
bool calc(pll a, pll b){
	a.first; b.first;
	a.second /= N; b.second /= N;
	return (a.first * b.second > a.second * b.first);
}
int main(){
	scanf("%lld%lld", &N, &L);
	for(int i=1; i<=N; i++){
		for(int j=1; j<=L; j++){
			scanf("%lld", &arr[i][j]);
			sum[i]+=arr[i][j];
		}
		int now = 1;
		ll S = 0;
		for(int j=1; j<=L; j++){
			while(1){
				//cout<<S<<" "<<now<<endl;
				if((S+arr[i][j]) * N <= now * sum[i]){
					break;
				}
				pll p;
				p.first = sum[i] * now - S * N + (j-1) * N * arr[i][j];
				p.second = N * arr[i][j];
				vt[i].pb(p);
				//cout<<p.first<<" "<<p.second<<endl;
				now++;
			}
			S += arr[i][j];
		}
	}
	for(int i=0; i<N-1; i++){
		pll prv = {1, 0};
		int idx=0;
		for(int j=1; j<=N; j++){
			//cout<<prv.first<<" "<<prv.second<<" "<<vt[j][i].first<<" "<<vt[j][i].second<<endl;
			if(!vst[j] && calc(prv, vt[j][i])){
				idx = j; prv = vt[j][i];
			}
		}
		//cout<<idx<<endl;
		vst[idx] = true;
		ans.pb(prv);
		ans2.pb(idx);
	}
	for(int j=1; j<=N; j++){
		if(!vst[j]){
			ans2.pb(j);
			break;
		}
	}
	for(int i=0; i<ans.size(); i++){
		printf("%lld %lld\n", ans[i].first, ans[i].second);
	}
	for(int i=0; i<ans2.size(); i++){
		printf("%d ", ans2[i]);
	}
	return 0;
}
Compilation message (stderr)
naan.cpp: In function 'bool calc(pll, pll)':
naan.cpp:37:4: warning: statement has no effect [-Wunused-value]
  a.first; b.first;
  ~~^~~~~
naan.cpp:37:13: warning: statement has no effect [-Wunused-value]
  a.first; b.first;
           ~~^~~~~
naan.cpp: In function 'int main()':
naan.cpp:87:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0; i<ans.size(); i++){
               ~^~~~~~~~~~~
naan.cpp:90:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0; i<ans2.size(); i++){
               ~^~~~~~~~~~~~
naan.cpp:43:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%lld%lld", &N, &L);
  ~~~~~^~~~~~~~~~~~~~~~~~~~
naan.cpp:46:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
    scanf("%lld", &arr[i][j]);
    ~~~~~^~~~~~~~~~~~~~~~~~~~| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |