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 <iostream>
#include <bits/stdc++.h>
using namespace std;
const int MAXN =5e3+5;
int dist[MAXN][MAXN];
vector<int> v1[MAXN];
int cnt[MAXN];
int col[MAXN];
vector<pair<int,int>> edges;
bool visited[MAXN];
int p[MAXN];
int n;
int nxt;
int sz[MAXN];
void colour(int a,int b,int c){
    if(cnt[col[b]] == 0 && dist[a][b] == dist[a][c]){
        col[a] = col[b];
    }
    if(c!=-1){
        cnt[col[b]]++;
    }
    for(int x:v1[b]){
        if((!visited[x])||x==c){
            continue;
        }
        colour(a,x,b);
    }
    if(c!=-1){
        cnt[col[b]]--;
    }
}
void dfs(int curr,int par){
    visited[curr] = true;
    colour(curr,curr,-1);
    if(col[curr] == 0){
        col[curr] = nxt+1;
        nxt++;
    }
    for(int x:v1[curr]){
        if(!visited[x]){
           
            dfs(x,curr);
        }
    }
}
int findpar(int a){
    if(p[a] == a){
        return a;
    }
    return p[a] = findpar(p[a]);
}
void merge(int a,int b){
    if(findpar(a)==findpar(b)){
        return;
    }
    v1[a].push_back(b);
    v1[b].push_back(a);
    edges.push_back(make_pair(a,b));
    a = findpar(a);
    b=  findpar(b);
    
    if(sz[b]>sz[a]){
        swap(a,b);
    }
    p[b] = a;
    sz[a]+=sz[b];
    
}
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int tc;
    cin>>tc;
    cin>>n;
    for(int i=1;i<=n;i++){
        p[i] = i;
        sz[i] = 1;
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>dist[i][j];
            if(dist[i][j] == 1){
                merge(i,j);
            }
        }
    }
    vector<int> nodes;
    for(int i=1;i<=n;i++){
        if(p[i] == i){
            nodes.push_back(i);
        }
    }
    for(int i=0;i<nodes.size();i++){
        for(int j=i+1;j<nodes.size();j++){
            if(dist[nodes[i]][nodes[j]] == 2){
                merge(nodes[i],nodes[j]);
            }   
        }
    }
    dfs(1,0);
    for(int i=1;i<=n;i++){
        cout<<col[i]<<" ";
    }
    cout<<'\n';
    for(auto x:edges){
        cout<<x.first<<" "<<x.second<<'\n';
    }
}
Compilation message (stderr)
izlet.cpp: In function 'int main()':
izlet.cpp:94:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<nodes.size();i++){
                 ~^~~~~~~~~~~~~
izlet.cpp:95:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int j=i+1;j<nodes.size();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... |