#include <bits/stdc++.h>
using namespace std;
struct node {
  long long to, nxt;
} edge[100010 << 1];
struct Array {
  long long col, id;
} a[100010];
struct Sor {
  long long siz, id;
} s[100010];
long long n, u, v, cnt, tot, Gra, root, Min_ans;
long long head[100010], siz[100010], dep[100010], Max[100010], match[100010],
    dp[100010], vec[100010];
template <typename T>
inline T read(T &x) {
  T flg = 1;
  x = 0;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') flg = -flg;
    ch = getchar();
  }
  while (isdigit(ch)) x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar();
  return x *= flg;
}
template <typename T>
inline void write(T x) {
  if (x < 0) x = -x, putchar('-');
  if (x > 9) write(x / 10);
  putchar(x % 10 + '0');
}
template <typename T>
inline void writeln(T x) {
  write(x);
  puts("");
}
template <typename T>
inline void writesp(T x) {
  write(x);
  putchar(' ');
}
inline long long max(const long long &x, const long long &y) {
  return x > y ? x : y;
}
inline void add(long long u, long long v) {
  edge[++cnt].to = v;
  edge[cnt].nxt = head[u];
  head[u] = cnt;
}
inline void dfs1(long long u, long long fa) {
  dep[u] = dep[fa] + 1;
  for (register long long i = head[u]; i; i = edge[i].nxt) {
    long long v = edge[i].to;
    if (v == fa) continue;
    dfs1(v, u);
  }
}
inline void dfs2(long long u, long long fa) {
  for (register long long i = head[u]; i; i = edge[i].nxt) {
    long long v = edge[i].to;
    if (v == fa) continue;
    dfs2(v, u);
  }
  long long len = 0;
  for (register long long i = head[u]; i; i = edge[i].nxt) {
    long long v = edge[i].to;
    if (v == fa) continue;
    if (dp[v]) vec[++len] = v;
  }
  if (len & 1) {
    for (register long long i = 1; i < len; i += 2) {
      match[vec[i]] = vec[i + 1];
      match[vec[i + 1]] = vec[i];
      Min_ans += 4;
    }
    match[vec[len]] = u;
    match[u] = vec[len];
    Min_ans += 2;
  } else {
    if (u ^ 1) {
      if (!len) {
        dp[u] = u;
        return;
      }
      for (register long long i = 1; i <= len - 2; i += 2) {
        match[vec[i]] = vec[i + 1];
        match[vec[i + 1]] = vec[i];
        Min_ans += 4;
      }
      match[u] = vec[len - 1];
      match[vec[len - 1]] = vec[len];
      match[vec[len]] = u;
      Min_ans += 4;
    } else {
      if (!len) {
        long long t = edge[head[u]].to;
        match[u] = match[t];
        match[t] = u;
        Min_ans += 2;
      } else {
        for (register long long i = 1; i <= len - 2; i += 2) {
          match[vec[i]] = vec[i + 1];
          match[vec[i + 1]] = vec[i];
          Min_ans += 4;
        }
        match[vec[len - 1]] = u;
        match[vec[len]] = vec[len - 1];
        match[u] = vec[len];
        Min_ans += 4;
      }
    }
  }
}
inline void Cal_Min() {
  dfs1(1, 0);
  dfs2(1, 0);
}
inline void Print_Min() {
  for (register long long i = 1; i < n; ++i) writesp(match[i]);
  writeln(match[n]);
}
signed main() {
  read(n);
  for (register long long i = 1; i < n; ++i) {
    read(u);
    read(v);
    add(u, v);
    add(v, u);
  }
  Cal_Min();
  writesp(Min_ans);
  Print_Min();
  return 0;
}
