#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
template <class T>
void read(T &x) {
  int sgn = 1;
  char ch;
  x = 0;
  for (ch = getchar(); (ch < '0' || ch > '9') && ch != '-'; ch = getchar())
    ;
  if (ch == '-') ch = getchar(), sgn = -1;
  for (; '0' <= ch && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
  x *= sgn;
}
template <class T>
void write(T x) {
  if (x < 0)
    putchar('-'), write(-x);
  else if (x < 10)
    putchar(x + '0');
  else
    write(x / 10), putchar(x % 10 + '0');
}
struct edge {
  int to, nxt;
} tree[N << 1];
int n, head[N], cnt = 0;
void addedge(int u, int v) {
  edge e = {v, head[u]};
  tree[head[u] = cnt++] = e;
}
int sz[N], dfn[N], perm[N], tot = 0;
long long ans = 0ll;
void dfs(int u, int fa) {
  dfn[tot++] = u, sz[u] = 1;
  for (int i = head[u]; ~i; i = tree[i].nxt) {
    int v = tree[i].to;
    if (v != fa) {
      dfs(v, u);
      ans += min(sz[v], n - sz[v]) << 1;
      sz[u] += sz[v];
    }
  }
}
int main() {
  read(n);
  for (int i = 1; i <= n; i++) head[i] = -1;
  for (int i = 1; i < n; i++) {
    int u, v;
    read(u), read(v);
    addedge(u, v), addedge(v, u);
  }
  dfs(1, 0);
  write(ans), putchar('\n');
  for (int i = 0; i < n; i++) perm[dfn[i]] = dfn[(i + n / 2) % n];
  for (int i = 1; i <= n; i++) write(perm[i]), putchar(' ');
  putchar('\n');
  return 0;
}
