#include <bits/stdc++.h>
using namespace std;
long long n, ans[100001], num;
vector<long long> adj[100001];
long long subsz[100001], subid, dist[100001];
vector<long long> sub[100001];
long long dfs1(long long x, long long p, long long dis) {
  subsz[x] = 1;
  dist[x] = dis;
  if (p != -1) sub[subid].push_back(x);
  for (auto i : adj[x]) {
    if (i == p) continue;
    subsz[x] += dfs1(i, x, dis + 1);
    if (p == -1) subid++;
  }
  return subsz[x];
}
long long dfs2(long long x, long long p) {
  for (auto i : adj[x]) {
    if (i == p) continue;
    if (subsz[i] > n / 2) {
      return dfs2(i, x);
    }
  }
  return x;
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cin >> n;
  for (long long i = 1; i < n; i++) {
    long long a, b;
    cin >> a >> b;
    adj[a].push_back(b);
    adj[b].push_back(a);
  }
  for (long long i = 1; i <= n; i++) {
    ans[i] = i;
  }
  dfs1(1, -1, 0);
  for (long long i = 0; i < subid; i++) {
    sub[i].clear();
  }
  subid = 0;
  long long cent = dfs2(1, -1);
  dfs1(cent, -1, 0);
  vector<long long> arr[2];
  for (long long i = 0; i < subid; i++) {
    for (auto j : sub[i]) {
      if (arr[0].size() == n / 2)
        arr[1].push_back(j);
      else
        arr[0].push_back(j);
    }
  }
  if (n % 2 == 0) {
    arr[1].push_back(cent);
    for (long long i = 0; i < arr[1].size(); i++) {
      long long a = arr[0][i], b = arr[1][i];
      ans[a] = b;
      ans[b] = a;
      num += (dist[a] + dist[b]) * 2;
    }
  } else {
    for (long long i = 1; i < arr[1].size(); i++) {
      long long a = arr[0][i], b = arr[1][i];
      ans[a] = b;
      ans[b] = a;
      num += (dist[a] + dist[b]) * 2;
    }
    long long a = arr[0][0], b = arr[1][0], c = cent;
    num += (dist[a] + dist[b]) * 2;
    ans[a] = c;
    ans[c] = b;
    ans[b] = a;
  }
  cout << num << '\n';
  long long rev[n + 1];
  for (long long i = 1; i <= n; i++) {
    rev[ans[i]] = i;
  }
  for (long long i = 1; i <= n; i++) {
    cout << rev[i] << ' ';
  }
}
