#include <bits/stdc++.h>
using namespace std;
const long long maxn = 2e5 + 7;
const long long mod = 1e9 + 9;
const long long INF = 1e9 + 7;
const long long mlog = 21;
const long long SQ = 400;
struct NODE {
  long long a;
  long long b;
  long long c;
};
vector<long long> adj[maxn];
vector<long long> leaves;
long long n;
long long par[mlog][maxn];
long long h[maxn];
long long loss[maxn];
long long vr = 1, ur;
void dfs(long long v, long long pr = -1) {
  for (long long u : adj[v]) {
    if (u != pr) {
      h[u] = h[v] + 1, par[0][u] = v;
      if (h[u] > h[vr]) vr = u;
      dfs(u, v);
    }
  }
}
void pre_process() {
  for (long long j = 1; j < mlog; j++)
    for (long long i = 1; i <= n; i++) par[j][i] = par[j - 1][par[j - 1][i]];
}
long long getpar(long long v, long long l) {
  for (long long j = 0; j < mlog; j++)
    if (l & (1 << j)) v = par[j][v];
  return v;
}
long long LCA(long long u, long long v) {
  if (h[u] < h[v]) swap(u, v);
  u = getpar(u, h[u] - h[v]);
  if (u == v) return v;
  for (long long j = mlog - 1; j >= 0; j--) {
    long long p1 = par[j][u];
    long long p2 = par[j][v];
    if (p1 != p2) u = p1, v = p2;
  }
  return par[0][v];
}
pair<long long, long long> ADD(long long v) {
  long long lcaU = LCA(ur, v);
  long long lcaV = LCA(vr, v);
  return ((h[v] + h[ur] - 2 * h[lcaU] > h[v] + h[vr] - 2 * h[lcaV])
              ? (make_pair(ur, h[v] + h[ur] - 2 * h[lcaU]))
              : make_pair(vr, h[v] + h[vr] - 2 * h[lcaV]));
}
long long mark[maxn];
long long ans = 0;
vector<NODE> path;
void solve() {
  dfs(1);
  h[vr] = 0;
  ur = vr;
  par[0][vr] = 0;
  dfs(vr);
  long long x = vr;
  while (x != 0) {
    mark[x] = true;
    x = par[0][x];
  }
  pre_process();
  for (long long i = 1; i <= n; i++)
    if (adj[i].size() == 1 && !mark[i]) leaves.push_back(i);
  long long i = 0;
  long long m = leaves.size();
  while (i < m) {
    if (leaves[i] == -1) {
      i++;
      continue;
    }
    long long v = leaves[i];
    loss[par[0][v]]++;
    pair<long long, long long> p1 = ADD(v);
    ans += p1.second;
    path.push_back({p1.first, v, v});
    if (!mark[par[0][v]] && adj[par[0][v]].size() - loss[par[0][v]] == 1)
      leaves[i] = par[0][v];
    else
      leaves[i] = -1;
  }
  x = vr;
  while (x != ur) {
    ans += h[x];
    path.push_back({ur, x, x});
    x = par[0][x];
  }
}
int32_t main() {
  long long t = 1;
  while (t--) {
    scanf("%lld", &n);
    for (long long i = 0; i < n - 1; i++) {
      long long u, v;
      scanf("%lld%lld", &u, &v);
      adj[u].push_back(v);
      adj[v].push_back(u);
    }
    solve();
    cout << ans << "\n";
    for (auto v : path) printf("%lld %lld %lld\n", v.a, v.b, v.c);
  }
  return 0;
}
