#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
const int N = 200005;
int n;
vector<int> g[N];
int par[N], par2[N], dis[N];
int deg[N];
int sub[N];
void calc_sub(int v, int p = 0) {
  sub[v] = 1;
  for (int i : g[v]) {
    if (i == p) continue;
    calc_sub(i, v);
    sub[v] += sub[i];
  }
}
int centroid(int v, int p = 0) {
  for (int i : g[v]) {
    if (i != p && sub[i] > n / 2) {
      return centroid(i, v);
    }
  }
  return v;
}
vector<pair<int, int>> s[N];
bool cmp(vector<pair<int, int>> a, vector<pair<int, int>> b) {
  return a.size() > b.size();
}
int where[N], where2[N];
int main() {
  ios_base ::sync_with_stdio(0);
  cin.tie(0);
  cin >> n;
  if (n == 2) {
    cout << "2\n2 1" << endl;
    return 0;
  }
  for (int i = 1, a, b; i < n; i++) {
    cin >> a >> b;
    g[a].push_back(b);
    g[b].push_back(a);
    deg[a]++;
    deg[b]++;
  }
  calc_sub(1);
  int rt = centroid(1);
  queue<int> q;
  q.push(rt);
  vector<int> ord;
  while (!q.empty()) {
    int cur = q.front();
    q.pop();
    ord.push_back(cur);
    for (int i : g[cur]) {
      if (i != par[cur]) {
        par[i] = cur;
        dis[i] = dis[cur] + 1;
        if (cur == rt)
          par2[i] = i;
        else
          par2[i] = par2[cur];
        q.push(i);
      }
    }
  }
  reverse(ord.begin(), ord.end());
  vector<int> used(n + 1, 0), pos(n + 1, 0);
  vector<int> mp(n + 1, 0);
  int nxt = 0;
  for (int i = 1; i <= n; i++) {
    if (i == rt || mp[par2[i]]) continue;
    mp[par2[i]] = nxt++;
  }
  for (int i = 1; i <= n; i++) {
    if (i != rt) {
      s[mp[par2[i]]].push_back({dis[i], i});
    }
  }
  sort(s, s + nxt, cmp);
  s[nxt++].push_back({0, rt});
  long long res = 0;
  int ne = 1;
  for (int i = 0; i < nxt - 1; i++) {
    while (where[i] < (int)s[i].size()) {
      int cnt = 0;
      while (ne == i || where2[ne] == (int)s[ne].size()) {
        cnt++;
        ne = (ne + 1) % nxt;
      }
      pos[s[i][where[i]].second] = s[ne][where2[ne]].second;
      res += (s[i][where[i]].first + s[ne][where2[ne]].first);
      where[i]++;
      where2[ne]++;
    }
  }
  ne = 0;
  int cnt = 0;
  while (ne < nxt - 1 && where2[ne] == (int)s[ne].size()) {
    ne++;
  }
  if (ne < nxt - 1) {
    pos[rt] = s[ne][where2[ne]].second;
    res += (s[ne][where2[ne]].first);
  }
  if (pos[rt] == 0) {
    int x = -1;
    for (int j : g[rt]) {
      if ((int)g[j].size() > 1) {
        x = j;
        break;
      }
    }
    if (x == -1) {
      int a = g[rt][0], b = g[rt][1];
      pos[rt] = a;
      pos[a] = b;
      pos[b] = rt;
    } else {
      int to = pos[x];
      pos[x] = rt;
      pos[rt] = to;
    }
  }
  cout << res << endl;
  for (int i = 1; i <= n; i++) {
    cout << pos[i] << " ";
  }
  cout << endl;
  return 0;
}
