#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 1, INF = 0x3f3f3f3f;
long long int ans;
priority_queue<pair<int, int> > q;
vector<int> e[N], t[N];
int n, x, y, z, rt, tot, minn = INF, siz[N], a[N];
inline void add_edge(int x, int y) { e[x].push_back(y), e[y].push_back(x); }
inline void dfs1(int u, int fa = 0) {
  int maxn(siz[u] = 1);
  for (int v : e[u])
    if (v != fa) dfs1(v, u), siz[u] += siz[v], maxn = max(maxn, siz[v]);
  if ((maxn = max(maxn, n - siz[u])) < minn) minn = maxn, rt = u;
}
inline void dfs2(int u, int fa = 0, int d = 1) {
  t[tot].push_back(u), ans += d * 2;
  for (int v : e[u])
    if (v != fa) dfs2(v, u, d + 1);
}
inline int top() {
  int x = q.top().second;
  return q.pop(), x;
}
inline void push(int x) {
  if (!t[x].empty()) q.push(pair<int, int>(t[x].size(), x));
}
inline void two() {
  int x = top(), y = top();
  a[t[x].back()] = t[y].back(), a[t[y].back()] = t[x].back();
  t[x].pop_back(), push(x), t[y].pop_back(), push(y);
}
inline void three() {
  int x = top(), y = top(), z = top();
  a[t[x].back()] = t[y].back(), a[t[y].back()] = t[z].back(),
  a[t[z].back()] = t[x].back();
  t[x].pop_back(), push(x), t[y].pop_back(), push(y), t[z].pop_back(), push(z);
}
int main() {
  scanf("%d", &n);
  for (int i = 2; i <= n; i++) scanf("%d%d", &x, &y), add_edge(x, y);
  dfs1(1), t[++tot].push_back(rt);
  for (int v : e[rt])
    ++tot, dfs2(v, rt), q.push(pair<int, int>(t[tot].size(), tot));
  cout << ans << '\n', q.push(pair<int, int>(1, 1));
  if (n & 1) three();
  while (!q.empty()) two();
  for (int i = 1; i <= n; i++) cout << a[i] << ' ';
  return 0;
}
