func_code_string: #include <bits/stdc++.h>   using namespace std;   long long n;   vector<long long> G[500005];   long long t1, d1, t2, d2;   long long dis1[500005], dis2[500005];   long long inp[500005], in[500005];   stringstream ss;   void dfs1(long long u, long long fa, long long d) {     if (d > d1) {       d1 = d;       t1 = u;     }     for (long long i = 0; i < G[u].size(); i++) {       if (G[u][i] == fa) continue;       dfs1(G[u][i], u, d + 1);     }   }   void dfs2(long long u, long long fa, long long d) {     if (d > d2) {       d2 = d;       t2 = u;     }     dis1[u] = d;     for (long long i = 0; i < G[u].size(); i++) {       if (G[u][i] == fa) continue;       dfs2(G[u][i], u, d + 1);     }   }   void dfs3(long long u, long long fa, long long d) {     dis2[u] = d;     for (long long i = 0; i < G[u].size(); i++) {       if (G[u][i] == fa) continue;       dfs3(G[u][i], u, d + 1);     }   }   void findpath(long long u, long long fa, long long t) {     inp[u] = true;     if (u == t) {       memcpy(in, inp, sizeof inp);       return;     }     for (long long i = 0; i < G[u].size(); i++) {       if (G[u][i] == fa) continue;       findpath(G[u][i], u, t);     }     inp[u] = false;   }   long long ans;   bool del[500005];   long long deg[500005];   void dfs4(long long u, long long fa) {     del[u] = true;     if ((dis1[u] > dis2[u] || del[t2]) && !del[t1]) {       ans += dis1[u];       ss << t1 <<     << u <<     << u << endl;     } else if (!del[t2]) {       ans += dis2[u];       ss << t2 <<     << u <<     << u << endl;     }     for (long long i = 0; i < G[u].size(); i++) {       if (G[u][i] == fa) continue;       if (in[G[u][i]]) dfs4(G[u][i], u);     }   }   signed main() {     cin >> n;     for (long long i = 1; i <= n - 1; i++) {       long long u, v;       cin >> u >> v;       G[u].push_back(v);       G[v].push_back(u);       deg[u]++;       deg[v]++;     }     dfs1(1, 0, 0);     dfs2(t1, 0, 0);     dfs3(t2, 0, 0);     findpath(t1, 0, t2);     queue<long long> Q;     for (long long i = 1; i <= n; i++) {       if (deg[i] == 1) Q.push(i);     }     while (Q.size()) {       long long i = Q.front();       Q.pop();       if (in[i]) continue;       if (del[i]) continue;       del[i] = true;       if (dis1[i] > dis2[i]) {         ans += dis1[i];         ss << t1 <<     << i <<     << i << endl;       } else {         ans += dis2[i];         ss << t2 <<     << i <<     << i << endl;       }       for (long long j = 0; j < G[i].size(); j++) {         deg[G[i][j]]--;         if (deg[G[i][j]] == 1) Q.push(G[i][j]);       }     }     dfs4(t1, 0);     cout << ans << endl;     cout << ss.str() << endl;     return 0;   }   