#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,popcnt,abm,mmx,tune=native")
#pragma GCC optimize("fast-math")
using namespace std;
mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
const int MAXN = 100;
const long long INF = 1e9;
vector<vector<long long>> g;
long long ans = 0;
vector<long long> to;
long long ctr = 0;
long long n;
vector<long long> sz;
long long dfs(long long v, long long p = -1) {
  long long tsz = 1;
  for (long long i : g[v]) {
    if (i == p) continue;
    tsz += dfs(i, v);
  }
  sz[v] = tsz;
  return tsz;
}
void fnd(long long v, long long p = -1) {
  for (long long i : g[v]) {
    if (i == p) continue;
    if (sz[i] * 2 >= n) {
      fnd(i, v);
      return;
    }
  }
  ctr = v;
}
vector<long long> c;
void cdfs(long long v, long long p, long long cl) {
  c[v] = cl;
  for (long long i : g[v]) {
    if (i == p) continue;
    cdfs(i, v, cl);
  }
}
vector<long long> d;
void ddfs(long long v, long long p = -1, long long dd = 0) {
  d[v] = dd;
  for (long long i : g[v]) {
    if (i == p) continue;
    ddfs(i, v, dd + 1);
  }
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n;
  g.assign(n, vector<long long>());
  to.assign(n, 0);
  long long a, b;
  for (long long i = 0; i < n - 1; i++) {
    cin >> a >> b;
    a--, b--;
    g[a].emplace_back(b);
    g[b].emplace_back(a);
  }
  sz.assign(n, 0);
  dfs(0);
  fnd(0);
  d.assign(n, 0);
  ddfs(ctr);
  dfs(ctr);
  c.assign(n, 0);
  long long curc = 0;
  for (long long i : g[ctr]) {
    assert(sz[i] * 2 <= n);
    cdfs(i, ctr, curc);
    curc++;
  }
  c[ctr] = curc;
  vector<vector<long long>> vs(curc);
  for (long long i = 0; i < n; i++) {
    if (i == ctr) continue;
    vs[c[i]].emplace_back(i);
  }
  stable_sort(vs.begin(), vs.end(),
              [](const vector<long long>& a, const vector<long long>& b) {
                return a.size() < b.size();
              });
  long long tsz = 0;
  for (long long i = 0; i < (long long)vs.size(); i++) {
    assert((long long)vs[i].size() * 2 <= n);
    assert(i == 0 || vs[i].size() >= vs[i - 1].size());
    tsz += (long long)vs[i].size();
  }
  assert(tsz + 1 == n);
  assert(vs.size() >= g[ctr].size());
  set<pair<long long, long long>> s;
  for (long long i = 0; i < (long long)vs.size(); i++) {
    s.insert(make_pair(-(long long)vs[i].size(), i));
  }
  while ((long long)s.size() > 1) {
    auto r1 = *s.begin();
    s.erase(s.begin());
    auto r2 = *s.begin();
    s.erase(s.begin());
    long long l = r1.second;
    long long r = r2.second;
    long long vl = vs[l].back();
    vs[l].pop_back();
    long long vr = vs[r].back();
    vs[r].pop_back();
    to[vl] = vr;
    to[vr] = vl;
    assert(c[vl] != c[vr]);
    ans += d[vr] + d[vl] + d[vr] + d[vl];
    if (vs[l].size()) s.insert(make_pair(-(long long)vs[l].size(), l));
    if (vs[r].size()) s.insert(make_pair(-(long long)vs[r].size(), r));
  }
  if (s.empty()) {
    long long v1 = 0;
    if (ctr == v1) v1++;
    long long v2 = to[v1];
    to[ctr] = v1;
    to[v2] = ctr;
  } else {
    long long l = s.begin()->second;
    assert((long long)vs[l].size() < 2);
    long long vv = vs[l][0];
    to[vv] = ctr;
    to[ctr] = vv;
    ans += (d[vv] << 1);
  }
  cout << ans << '\n';
  for (auto i : to) cout << i + 1 << ' ';
  cout << '\n';
  return 0;
}
