#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9 + 7;
const long long linf = 1ll * inf * inf;
const int N = 200000 + 7;
const int M = 22;
const int multipleTest = 0;
int n;
vector<int> adj[N];
int d[N][2];
int pa[N];
int cnt[N];
bool checked = false;
void dfs(int u, int r, int type) {
  d[u][type] = (r == -1) ? 0 : (d[r][type] + 1);
  pa[u] = r;
  if (r != -1 && type == 1 && !checked) {
    cnt[r]++;
  }
  for (int v : adj[u]) {
    if (v != r) {
      dfs(v, u, type);
    }
  }
}
bool onStraigtLine[N];
void setLine(int s) {
  while (s != -1) {
    onStraigtLine[s] = true;
    s = pa[s];
  }
}
int stk[N], top;
long long ans;
vector<pair<pair<int, int>, int>> all;
void calc(int s, int t) {
  ans = 0;
  top = 0;
  for (int i = 1; i <= n; ++i)
    if (!onStraigtLine[i] && !cnt[i]) {
      stk[top++] = i;
    }
  for (int i = 0; i < top; ++i) {
    int u = stk[i];
    int root = d[u][0] >= d[u][1] ? s : t;
    ans += max(d[u][0], d[u][1]);
    all.push_back(make_pair(make_pair(u, root), u));
    if (pa[u] != -1 && !onStraigtLine[pa[u]]) {
      cnt[pa[u]]--;
      if (!cnt[pa[u]]) {
        stk[top++] = pa[u];
      }
    }
  }
  int dist = d[t][0];
  while (t != s) {
    ans += dist--;
    all.push_back(make_pair(make_pair(s, t), t));
    t = pa[t];
  }
}
void solve() {
  cin >> n;
  for (int i = (1), _b = (n); i < _b; ++i) {
    int u, v;
    scanf("%d%d", &u, &v);
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  int curRoot = 1;
  dfs(curRoot, -1, 0);
  for (int i = 2; i <= n; ++i)
    if (d[i][0] > d[curRoot][0]) curRoot = i;
  dfs(curRoot, -1, 1);
  int nxtRoot = 1;
  for (int i = 2; i <= n; ++i)
    if (d[i][1] > d[nxtRoot][1]) nxtRoot = i;
  checked = true;
  dfs(nxtRoot, -1, 1);
  dfs(curRoot, -1, 0);
  setLine(nxtRoot);
  calc(curRoot, nxtRoot);
  cout << ans << '\n';
  for (auto x : all) {
    printf("%d %d %d\n", x.first.first, x.first.second, x.second);
  }
}
int main() {
  int Test = 1;
  if (multipleTest) cin >> Test;
  for (int i = 0; i < Test; ++i) {
    solve();
  }
}
