#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n;
struct bian {
  int from, to;
} eg[N << 1];
int front[N], num;
void add(int x, int y) {
  eg[++num].to = y;
  eg[num].from = front[x];
  front[x] = num;
}
int siz[N];
int root;
long long ans;
void dfs1(int o, int from) {
  siz[o] = 1;
  int sf = 1;
  for (int i = front[o]; i; i = eg[i].from) {
    int to = eg[i].to;
    if (to == from) continue;
    dfs1(to, o);
    ans += 2ll * min(siz[to], n - siz[to]);
    siz[o] += siz[to];
    if (siz[to] > n / 2) sf = 0;
  }
  if (n - siz[o] > n / 2) sf = 0;
  if (sf) root = o;
}
int col[N];
set<pair<int, int> > se;
vector<int> v[N];
void dfs2(int o, int from, int c) {
  siz[o] = 1;
  col[o] = c;
  v[c].push_back(o);
  for (int i = front[o]; i; i = eg[i].from) {
    int to = eg[i].to;
    if (to == from) continue;
    dfs2(to, o, c);
    siz[o] += siz[to];
  }
}
int lsty;
int a[N];
int main() {
  scanf("%d", &n);
  for (int i = 1; i < n; ++i) {
    a[i] = i;
    int x, y;
    scanf("%d%d", &x, &y);
    add(x, y);
    add(y, x);
  }
  a[n] = n;
  dfs1(1, 0);
  num = 0;
  for (int i = front[root]; i; i = eg[i].from) {
    int to = eg[i].to;
    dfs2(to, root, ++num);
    se.insert(make_pair(siz[to], num));
  }
  while (se.size() >= 2) {
    int sizx, x, sizy, y;
    sizx = (*(--se.end())).first;
    x = (*(--se.end())).second;
    se.erase(--se.end());
    sizy = (*(--se.end())).first;
    y = (*(--se.end())).second;
    se.erase(--se.end());
    if (sizx > 1) se.insert(make_pair(sizx - 1, x));
    if (sizy > 1) se.insert(make_pair(sizy - 1, y));
    lsty = a[v[y][v[y].size() - 1]];
    swap(a[v[x][v[x].size() - 1]], a[v[y][v[y].size() - 1]]);
    v[x].pop_back();
    v[y].pop_back();
  }
  if (se.size() != 0) {
    int sizx, x, sizy, y;
    sizx = (*(--se.end())).first;
    x = (*(--se.end())).second;
    swap(a[v[x][v[x].size() - 1]], a[root]);
  } else {
    swap(a[root], a[lsty]);
  }
  printf("%lld\n", ans);
  for (int i = 1; i <= n; ++i) printf("%d ", a[i]);
}
