#include <bits/stdc++.h>
using namespace std;
int n;
vector<int> adj[100005];
int par[100005], subtr[100005];
int cen;
long long ans;
int Move[100005];
void dfs1(int a) {
  subtr[a] = 1;
  for (int i : adj[a]) {
    if (i == par[a]) continue;
    par[i] = a;
    dfs1(i);
    subtr[a] += subtr[i];
  }
}
void dfs2(int a) {
  for (int i : adj[a]) {
    if (i == par[a]) continue;
    if (subtr[i] > n / 2) {
      dfs2(i);
      return;
    }
  }
  cen = a;
}
vector<vector<int> > comps;
bool used[100005];
void bfs(int a) {
  queue<pair<int, int> > q;
  q.push({a, 1});
  used[a] = 1;
  vector<int> curr_comp;
  curr_comp.push_back(a);
  while (!q.empty()) {
    int u = q.front().first, d = q.front().second;
    q.pop();
    ans += d;
    for (int v : adj[u]) {
      if (!used[v]) {
        used[v] = 1;
        curr_comp.push_back(v);
        q.push({v, d + 1});
      }
    }
  }
  comps.push_back(curr_comp);
}
bool cmp(vector<int> a, vector<int> b) { return a.size() > b.size(); }
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> n;
  for (int i = 1; i < n; i++) {
    int u, v;
    cin >> u >> v;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  dfs1(1);
  dfs2(1);
  used[cen] = 1;
  comps.push_back({cen});
  for (int i : adj[cen]) bfs(i);
  sort(comps.begin(), comps.end(), cmp);
  int cnt = comps.size();
  comps.push_back(comps[0]);
  int pos1 = 1, pos2 = 0;
  for (int i = 0; i < cnt; i++) {
    int sz = comps[i].size();
    for (int j = 0; j < sz; j++) {
      Move[comps[i][j]] = comps[pos1][pos2];
      pos2++;
      if (pos2 == comps[pos1].size()) pos1++, pos2 = 0;
    }
  }
  cout << ans * 2 << '\n';
  for (int i = 1; i <= n; i++) cout << Move[i] << ' ';
  cout << '\n';
}
