#include <bits/stdc++.h>
bool isFile;
using namespace std;
const int dx[] = {1, 0, -1, 0, 1, 1, -1, -1};
const int dy[] = {0, 1, 0, -1, 1, -1, 1, -1};
const int day[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
void _();
void faster() {
  _();
  if (isFile) {
    freopen(
        "taskA"
        ".in",
        "r", stdin);
    freopen(
        "taskA"
        ".out",
        "w", stdout);
  }
  if (1) {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
  }
}
const long long INF = 9e18;
const int inf = 2e9;
const int MOD = 1e9 + 7;
const long double PI = acos(-1);
const long double EPS = 1e-7;
const int N = 1e5 + 5;
const int M = 1234;
set<int> g[N];
int res[N];
int tin[N];
int tout[N];
int up[18][N];
int depth[N];
int was[N];
int timer;
bool isLeaf(int v) { return g[v].size() == 1; }
void dfs(int v, int p) {
  tin[v] = ++timer;
  depth[v] = depth[p] + 1;
  up[0][v] = p;
  for (int i = 1; i < 18; i++) {
    up[i][v] = up[i - 1][up[i - 1][v]];
  }
  for (int to : g[v]) {
    if (to != p) dfs(to, v);
  }
  tout[v] = timer;
}
bool upper(int v, int u) { return tin[v] <= tin[u] && tin[u] <= tout[v]; }
int lca(int v, int u) {
  if (upper(u, v)) return u;
  if (upper(v, u)) return v;
  for (int i = 17; i >= 0; i--) {
    if (!upper(up[i][v], u)) {
      v = up[i][v];
    }
  }
  return up[0][v];
}
int dist(int v, int u) { return depth[u] + depth[v] - 2 * depth[lca(u, v)]; }
void solve() {
  int n;
  cin >> n;
  for (int i = 1; i < n; i++) {
    int u, v;
    cin >> u >> v;
    g[u].insert(v);
    g[v].insert(u);
  }
  for (int i = 1; i <= n; i++) {
    res[i] = i;
  }
  queue<int> q;
  for (int i = 1; i <= n; i++) {
    if (isLeaf(i)) q.push(i);
  }
  dfs(1, 1);
  while (!q.empty()) {
    int v = q.front();
    q.pop();
    if (res[v] == v) {
      for (int to : g[v]) {
        swap(res[to], res[v]);
        g[to].erase(v);
        vector<int> who;
        for (int fo : g[to]) {
          who.push_back(fo);
        }
        for (int fo : who) {
          if (!isLeaf(fo)) {
            g[fo].erase(to);
          }
          g[to].erase(fo);
        }
        for (int fo : who) {
          if (isLeaf(fo)) {
            q.push(fo);
          }
        }
        break;
      }
    }
  }
  int cnt = 0;
  for (int i = 1; i <= n; i++) {
    if (res[i] == i) {
      for (int to : g[i]) {
        swap(res[i], res[to]);
        break;
      }
      cnt++;
    }
  }
  int ans = 0;
  for (int i = 1; i <= n; i++) {
    ans += dist(i, res[i]);
  }
  cout << ans << '\n';
  for (int i = 1; i <= n; i++) {
    cout << res[i] << ' ';
  }
}
void prepare() {}
void stress() {}
void slow() {}
void _() {}
int main() {
  faster();
  int t = 1;
  int id = 1;
  while (t--) {
    solve();
  }
  return 0;
}
