#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;   }   