#include <bits/stdc++.h>   const int INF = 1e9;   using namespace std;   void dfs(int v, int p, vector<vector<int> > &graph, vector<int> &sz) {     sz[v] = 1;     for (auto u : graph[v])       if (u != p) {         dfs(u, v, graph, sz);         sz[v] += sz[u];       }   }   void dfs(int v, int p, vector<vector<int> > &graph, vector<int> &c, int C) {     c[v] = C;     for (auto u : graph[v])       if (u != p) {         dfs(u, v, graph, c, C);       }   }   signed main() {     int n;     cin >> n;     vector<vector<int> > graph(n);     for (int i = 0; i < n - 1; i++) {       int a, b;       cin >> a >> b;       a--, b--;       graph[a].push_back(b);       graph[b].push_back(a);     }     vector<int> sz(n);     dfs(0, 0, graph, sz);     vector<int> cen;     long long ans = 0;     for (int i = 0; i < n; i++) {       if ((n - sz[i]) * 2 <= n) {         int t = 1;         for (auto u : graph[i]) {           if (sz[u] < sz[i]) {             if (2 * sz[u] <= n) continue;             t = 0;           }         }         if (t) cen.push_back(i);       }     }     for (int i = 0; i < n; i++) {       ans += 2 * min(sz[i], n - sz[i]);     }     cout << ans <<   n ;     if (cen.size() == 2) {       int v = cen[0], u = cen[1];       vector<int> c(n);       dfs(v, u, graph, c, 0);       dfs(u, v, graph, c, 1);       vector<int> p0, p1;       for (int i = 0; i < n; i++) {         if (c[i] == 0) p0.push_back(i);         if (c[i] == 1) p1.push_back(i);       }       vector<int> ans(n);       for (int i = 0; i < n / 2; i++) {         ans[p0[i]] = p1[i];         ans[p1[i]] = p0[i];       }       for (int i = 0; i < n; i++) {         cout << ans[i] + 1 <<    ;       }       return 0;     } else {       dfs(cen[0], cen[0], graph, sz);       int C = 0, idC = 0;       vector<int> c(n);       c[cen[0]] = -1;       int maxsz = 0;       for (auto u : graph[cen[0]]) {         dfs(u, cen[0], graph, c, C);         maxsz = max(maxsz, sz[u]);         if (maxsz == sz[u]) idC = C;         C++;       }       vector<pair<int, int> > q;       for (int i = 0; i < n; i++) {         if (i != cen[0] && c[i] != idC) q.push_back({c[i], i});       }       for (int i = 0; i < n; i++) {         if (i != cen[0] && c[i] == idC) q.push_back({INF, i});       }       q.push_back({INF + 1, cen[0]});       sort((q).begin(), (q).end());       vector<int> ans(n);       for (int i = 0; i < n; i++) {         ans[q[i].second] = q[(i + maxsz) % q.size()].second;       }       for (int i = 0; i < n; i++) {         assert(c[ans[i]] != c[i]);         cout << ans[i] + 1 <<    ;       }     }   }   