#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
template <class T>
inline void amin(T &x, const T &y) {
  if (y < x) x = y;
}
template <class T>
inline void amax(T &x, const T &y) {
  if (x < y) x = y;
}
template <class Iter>
void rprintf(const char *fmt, Iter begin, Iter end) {
  for (bool sp = 0; begin != end; ++begin) {
    if (sp)
      putchar(' ');
    else
      sp = true;
    printf(fmt, *begin);
  }
  putchar('\n');
}
int N;
vector<int> G[100011];
vector<int> que;
int par[100011];
const long long INF = 0x3f3f3f3f3f3f3f3fLL;
int last[100011];
struct State {
  long long cst;
  pair<int, int> left, right, op;
  State() {
    cst = INF;
    left = right = op = make_pair(-1, -1);
  }
};
State st[200011][2];
int name[100011];
void MAIN() {
  scanf("%d", &N);
  for (int i = 0, i_len = (N - 1); i < i_len; ++i) {
    int x, y;
    scanf("%d%d", &x, &y);
    x--;
    y--;
    G[x].push_back(y);
    G[y].push_back(x);
  }
  que.reserve(N);
  que.push_back(0);
  for (int i = 0, i_len = (N); i < i_len; ++i) {
    int v = que[i];
    for (__typeof((G[v]).begin()) e = (G[v]).begin(), e_end = (G[v]).end();
         e != e_end; ++e)
      if (*e != par[v]) {
        par[*e] = v;
        que.push_back(*e);
        G[*e].erase(remove(G[*e].begin(), G[*e].end(), v), G[*e].end());
      }
  }
  int cnt = 0;
  for (int i_ = 0, i__len = (N); i_ < i__len; ++i_) {
    int v = que[N - 1 - i_];
    int cur = cnt++;
    st[cur][0].cst = 0;
    for (__typeof((G[v]).begin()) e = (G[v]).begin(), e_end = (G[v]).end();
         e != e_end; ++e) {
      int nxt = cnt++;
      int pos = last[*e];
      for (int a = 0, a_len = (2); a < a_len; ++a)
        for (int b = 0, b_len = (2); b < b_len; ++b) {
          if (st[nxt][1].cst > st[cur][a].cst + st[pos][b].cst + 2) {
            st[nxt][1].cst = st[cur][a].cst + st[pos][b].cst + 2;
            st[nxt][1].left = make_pair(cur, a);
            st[nxt][1].right = make_pair(pos, b);
            st[nxt][1].op = make_pair(v, *e);
          }
        }
      for (int a = 0, a_len = (2); a < a_len; ++a) {
        if (st[nxt][a].cst > st[cur][a].cst + st[pos][1].cst) {
          st[nxt][a].cst = st[cur][a].cst + st[pos][1].cst;
          st[nxt][a].left = make_pair(cur, a);
          st[nxt][a].right = make_pair(pos, 1);
          st[nxt][a].op = make_pair(-1, -1);
        }
      }
      cur = nxt;
    }
    last[v] = cur;
  }
  vector<pair<int, int> > stk;
  stk.emplace_back(cnt - 1, 1);
  for (int i = 0, i_len = (N); i < i_len; ++i) name[i] = i;
  while (!stk.empty()) {
    int pos = stk.back().first;
    int a = stk.back().second;
    stk.pop_back();
    if (st[pos][a].op.first != -1) {
      int x = st[pos][a].op.first;
      int y = st[pos][a].op.second;
      swap(name[x], name[y]);
    }
    if (st[pos][a].left.first != -1) stk.push_back(st[pos][a].left);
    if (st[pos][a].right.first != -1) stk.push_back(st[pos][a].right);
  }
  printf("%lld\n", st[cnt - 1][1].cst);
  for (int i = 0, i_len = (N); i < i_len; ++i) name[i]++;
  rprintf("%d", name, name + N);
}
int main() {
  int TC = 1;
  for (int tc = 0, tc_len = (TC); tc < tc_len; ++tc) MAIN();
  return 0;
}
