func_code_string: #include <bits/stdc++.h>   using namespace std;   long long modulo = 1e9 + 7;   template <class X>   void printarr(X arr[], int n) {     for (int i = 0; i < n; ++i) cout << arr[i] <<    ;     cout << endl;   }   long long fpow(long long a, long long n) {     long long ans = 1;     while (n) {       if (n & 1) ans = (ans * a) % modulo;       a = (a * a) % modulo;       n = n >> 1;     }     return ans;   }   const int M = 2e3 + 10;   vector<int> graph[M];   int visited[M] = {0};   int dfs(int source, int original) {     visited[source] = original;     int max_height = -1;     for (int a : graph[source]) {       if (visited[a] == original) continue;       max_height = max(dfs(a, original), max_height);     }     return 1 + max_height;   }   void solve(int source, int distance) {     visited[source] = distance;     for (int a : graph[source]) {       if (visited[a] == -1) solve(a, distance + 1);     }   }   int main() {     ios_base::sync_with_stdio(false);     cin.tie(NULL);     cout.tie(NULL);     int n, m;     cin >> n >> m;     int parent[n + 1], min_distance[n + 1];     for (int i = 0; i <= n; ++i) {       parent[i] = i;       min_distance[i] = INT_MAX;     }     for (int i = 0; i < m; ++i) {       int u, v;       cin >> u >> v;       graph[u].push_back(v);       graph[v].push_back(u);     }     if (n == 1) {       cout << 0 << endl;       return 0;     }     for (int i = 1; i <= n; ++i) {       int distance = dfs(i, i);       if (distance < min_distance[i]) {         for (int j = 1; j <= n; ++j) {           if (visited[j] == i) {             min_distance[j] = distance;             parent[j] = i;           }         }       }     }     vector<pair<int, int> > connected_components;     for (int i = 1; i <= n; ++i) {       if (parent[i] == i) connected_components.push_back({min_distance[i], i});     }     sort(connected_components.begin(), connected_components.end(),          greater<pair<int, int> >());     int cnt = connected_components.size();     for (int i = 1; i < cnt; ++i) {       int u = connected_components[0].second, v = connected_components[i].second;       graph[u].push_back(v);       graph[v].push_back(u);     }     for (int i = 1; i <= n; ++i) visited[i] = -1;     solve(connected_components[0].second, 0);     int distance = 0, leaf;     for (int i = 1; i <= n; ++i) {       if (visited[i] > distance) {         leaf = i;         distance = visited[i];       }     }     for (int i = 1; i <= n; ++i) visited[i] = 0;     cout << dfs(leaf, leaf) << endl;     for (int i = 1; i < cnt; ++i)       cout << connected_components[0].second <<                << connected_components[i].second << endl;     return 0;   }   