#include <bits/stdc++.h>
const long long N = 100005;
std::vector<long long> g[N];
std::vector<std::vector<long long> >::iterator t;
std::vector<std::vector<long long> > fl, tr;
long long min, ans[N], n, x, y, t2, t3, t4, max, ans2[N], dfn[N], num, size[N];
bool flag[N];
void dfs(long long u, long long fa) {
  std::vector<long long> tmp;
  dfn[++num] = u;
  size[u] = 1;
  for (long long i = 0; i < (signed)g[u].size(); i++) {
    long long v = g[u][i];
    if (v == fa) continue;
    dfs(v, u);
    size[u] += size[v];
    if (flag[v] == 0) tmp.push_back(v);
  }
  if (tmp.size() == 1 || tmp.size() == 2) {
    tmp.push_back(u);
    tr.push_back(tmp);
    flag[u] = 1;
    if (fa == 1) {
      if (tmp.size() == 2)
        t2 = tr.size() - 1;
      else
        t = --tr.end(), t3 = tr.size() - 1;
    }
  } else if (tmp.size() > 2) {
    tmp.push_back(u);
    fl.push_back(tmp);
    flag[u] = 1;
    if (fa == 1) t4 = fl.size() - 1;
  }
  max += 2 * std::min(size[u], n - size[u]);
}
void fix() {
  if (t2 != 0) {
    tr[t2].push_back(1);
    return;
  }
  if (t3 != 0) {
    std::vector<long long> tmp;
    for (long long i = 0; i < (signed)tr[t3].size(); i++)
      tmp.push_back(tr[t3][i]);
    tmp.push_back(1);
    tr.erase(t);
    fl.push_back(tmp);
    return;
  }
  fl[t4].push_back(1);
}
signed main() {
  scanf("%lld", &n);
  for (long long i = 1; i < n; i++)
    scanf("%lld%lld", &x, &y), g[x].push_back(y), g[y].push_back(x);
  dfs(1, 0);
  for (long long i = 1; i <= n; i++)
    ans2[dfn[i]] = dfn[(i + n / 2 - 1) % n + 1];
  if (flag[1] == 0) fix();
  for (long long i = 0; i < (signed)tr.size(); i++)
    if (tr[i].size() == 3) {
      tr[i].push_back(tr[i][0]);
      for (long long j = 0; j < (signed)tr[i].size() - 1; j++)
        ans[tr[i][j]] = tr[i][j + 1];
      min += 4;
    } else {
      ans[tr[i][0]] = tr[i][1], ans[tr[i][1]] = tr[i][0];
      min += 2;
    }
  for (long long i = 0; i < (signed)fl.size(); i++) {
    min += 2 * ((signed)fl[i].size() - 1);
    ans[fl[i][0]] = fl[i][1], ans[fl[i][1]] = fl[i][0];
    fl[i].push_back(fl[i][2]);
    for (long long j = 2; j < (signed)fl[i].size() - 1; j++)
      ans[fl[i][j]] = fl[i][j + 1];
  }
  printf("%lld\n", max);
  for (long long i = 1; i <= n; i++) printf("%lld ", ans2[i]);
  return 0;
}
