#include <bits/stdc++.h>
using namespace std;
int n;
struct node {
  vector<int> to;
  bool was = false;
  int count;
};
vector<node> graph;
long long sol = 0;
int count(int curr) {
  graph[curr].was = true;
  graph[curr].count = 1;
  for (int& a : graph[curr].to)
    if (!graph[a].was) {
      graph[curr].count += count(a);
      sol += min(graph[a].count, n - graph[a].count) << 1;
    }
  graph[curr].was = false;
  return graph[curr].count;
}
int centroid(int curr, int size) {
  graph[curr].was = true;
  int mxm = size - graph[curr].count, ans = 0;
  for (int& a : graph[curr].to)
    if (!graph[a].was)
      ans = max(ans, centroid(a, size)), mxm = max(mxm, graph[a].count);
  if (mxm <= size / 2) ans = curr;
  graph[curr].was = false;
  return ans;
}
void walk(int curr, vector<int>& v) {
  graph[curr].was = true;
  v.push_back(curr);
  for (int& a : graph[curr].to)
    if (!graph[a].was) walk(a, v);
}
void solve() {
  int si = count(1);
  int cent = centroid(1, si);
  vector<int> v;
  walk(cent, v);
  cout << sol << "\n";
  vector<int> ans(n + 1);
  for (int i = 0; i < n; i++) ans[v[i]] = v[(i + n / 2) % n];
  for (int i = 1; i <= n; i++) cout << ans[i] << " ";
  cout << "\n";
}
int main() {
  cin >> n;
  graph.resize(n + 1);
  for (int i = 1; i < n; i++) {
    int a, b;
    cin >> a >> b;
    graph[a].to.push_back(b);
    graph[b].to.push_back(a);
  }
  solve();
}
