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>
using namespace std;
#define pb push_back
#define mp make_pair
#define INF 9e18
#define M (ll)(1e5+5)
typedef long long ll;
typedef vector <ll> vi;
typedef pair <ll,ll> pll;
typedef vector <pll> vpll;
ll mx(ll a,ll b){if(a>=b) return a;return b;}
ll mn(ll a,ll b){if(a<b) return a;return b;}
ll c[3005][3005],cnt[3005],check[3005];
bool vis[3005];
vpll G;
vi g[3005];
struct dis{
    ll par[3005];
    ll baba(ll x){
        return par[x]==x ? x : (par[x]=baba(par[x]));
    }
    void uni(ll x,ll y){
        x=baba(x),y=baba(y);
        if(x!=y) par[x]=y;
    }
}d[2];
ll dfs2(ll u,ll p,ll cur){
    for(ll i=0;i<g[u].size();i++){
        ll v=g[u][i];
        if(!vis[v]) continue;
        if(v==p) continue;
        if(c[cur][u]==c[cur][v] and check[cnt[v]]==0)
            return cnt[v];
        check[cnt[v]]++;
        ll val=dfs2(v,u,cur);
        if(val!=-1) return val;
        check[cnt[v]]--;
    }
    return -1;
}
ll co=1;
void dfs1(ll u,ll p){
    vis[u]=1;
    for(ll i=0;i<3005;i++)
        check[i]=0;
    ll val=dfs2(u,0,u);
    if(val==-1) cnt[u]=co++;
    else cnt[u]=val;
    for(ll i=0;i<g[u].size();i++){
        ll v=g[u][i];
        if(v==p) continue;
        dfs1(v,u);
    }
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    ll t,n;cin>>t>>n;
    for(ll i=1;i<=n;i++)
        d[0].par[i]=d[1].par[i]=i;
    for(ll i=1;i<=n;i++)
        for(ll j=1;j<=n;j++){
            cin>>c[i][j];
            if(c[i][j]==1 and d[0].baba(i)!=d[0].baba(j)){
                G.pb(mp(i,j));
                d[0].uni(i,j);
                d[1].uni(i,j);
            }
        }
    for(ll i=1;i<=n;i++)
        for(ll j=1;j<=n;j++)
            if(c[i][j]==2 and d[0].baba(i)!=d[0].baba(j)){
                G.pb(mp(i,j));
                d[0].uni(i,j);
                g[d[1].baba(i)].pb(d[1].baba(j));
                g[d[1].baba(j)].pb(d[1].baba(i));
            }
    dfs1(d[1].baba(1),0);
    for(ll i=1;i<=n;i++)
        cout<<cnt[d[1].baba(i)]<<" ";
    cout<<endl;
    for(ll i=0;i<n-1;i++)
        cout<<G[i].first<<" "<<G[i].second<<endl;
    return 0;
}
Compilation message (stderr)
izlet.cpp: In function 'll dfs2(ll, ll, ll)':
izlet.cpp:28:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(ll i=0;i<g[u].size();i++){
                ~^~~~~~~~~~~~
izlet.cpp: In function 'void dfs1(ll, ll)':
izlet.cpp:49:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(ll i=0;i<g[u].size();i++){
                ~^~~~~~~~~~~~| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |