#include <bits/stdc++.h>
using namespace std;
int n;
vector<int> adj[100005], stx, sty;
long long mx = 0ll, ans[100005];
int sz[100005], par[100005];
pair<int, int> centroid = {0, 0};
bool cmp(int u, int v) { return sz[u] < sz[v]; }
void dfs(int nw, int bf) {
  par[nw] = bf;
  sz[nw] = 1;
  for (int nx : adj[nw])
    if (nx != bf) {
      dfs(nx, nw);
      sz[nw] += sz[nx];
    }
  sort(adj[nw].begin(), adj[nw].end(), cmp);
  mx += 2 * min(sz[nw], n - sz[nw]);
  centroid = max(centroid, {min(sz[nw], n - sz[nw]), nw});
}
void get_subtree(int nw, int bf, vector<int> &v) {
  v.push_back(nw);
  for (int nx : adj[nw])
    if (nx != bf) get_subtree(nx, nw, v);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n;
  for (int u, v, i = 1; i < n; i++) {
    cin >> u >> v;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  dfs(1, 0);
  int x = centroid.second, y = par[x];
  if (sz[x] * 2 > n) swap(x, y);
  get_subtree(x, y, stx);
  get_subtree(y, x, sty);
  for (int i = 0; i < stx.size(); i++) {
    ans[stx[i]] = sty[i];
    ans[sty[sty.size() - stx.size() + i]] = stx[i];
  }
  for (int i = 0; i < sty.size() - stx.size(); i++)
    ans[sty[i]] = sty[stx.size() + i];
  cout << mx << endl;
  for (int i = 1; i <= n; i++) cout << ans[i] << " ";
  return 0;
}
