#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;
}

### Prompt

Generate a CPP solution to the following problem:

You are given an unweighted tree with n vertices. Then n - 1 following operations are applied to the tree. A single operation consists of the following steps: 

  1. choose two leaves; 
  2. add the length of the simple path between them to the answer; 
  3. remove one of the chosen leaves from the tree. 



Initial answer (before applying operations) is 0. Obviously after n - 1 such operations the tree will consist of a single vertex. 

Calculate the maximal possible answer you can achieve, and construct a sequence of operations that allows you to achieve this answer!

Input

The first line contains one integer number n (2 ≤ n ≤ 2·105) — the number of vertices in the tree. 

Next n - 1 lines describe the edges of the tree in form ai, bi (1 ≤ ai, bi ≤ n, ai ≠ bi). It is guaranteed that given graph is a tree.

Output

In the first line print one integer number — maximal possible answer. 

In the next n - 1 lines print the operations in order of their applying in format ai, bi, ci, where ai, bi — pair of the leaves that are chosen in the current operation (1 ≤ ai, bi ≤ n), ci (1 ≤ ci ≤ n, ci = ai or ci = bi) — choosen leaf that is removed from the tree in the current operation. 

See the examples for better understanding.

Examples

Input

3
1 2
1 3


Output

3
2 3 3
2 1 1


Input

5
1 2
1 3
2 4
2 5


Output

9
3 5 5
4 3 3
4 1 1
4 2 2

### Response

```cpp
#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;
}

```