#include <bits/stdc++.h>
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,popcnt,abm,mmx,tune=native")
using namespace std;
template <typename T>
void uin(T &a, T b) {
  if (b < a) {
    a = b;
  }
}
template <typename T>
void uax(T &a, T b) {
  if (b > a) {
    a = b;
  }
}
const int N = 100 * 1000 + 228;
vector<int> g[N];
int h[N], parent[N];
bool used[N];
void dfs(int v, int par = -1) {
  if (par == -1)
    h[v] = 0;
  else
    h[v] = h[par] + 1;
  parent[v] = par;
  for (int to : g[v]) {
    if (to == par) continue;
    dfs(to, v);
  }
}
int go[N], who[N];
void make_swap(int first, int second) {
  int wx = who[first];
  int wy = who[second];
  go[wx] = second;
  go[wy] = first;
  who[first] = wy;
  who[second] = wx;
}
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  int n;
  cin >> n;
  for (int i = 0; i < n - 1; ++i) {
    int u, v;
    cin >> u >> v;
    g[u].emplace_back(v);
    g[v].emplace_back(u);
  }
  dfs(1);
  vector<int> V;
  for (int i = 1; i <= n; ++i) {
    V.emplace_back(i);
  }
  sort(V.begin(), V.end(),
       [&](int first, int second) { return h[first] > h[second]; });
  vector<pair<int, int> > matching;
  for (int v : V) {
    int p = parent[v];
    if (p != -1 && !used[v] && !used[p]) {
      used[v] = used[p] = 1;
      matching.emplace_back(v, p);
    }
  }
  for (int i = 1; i <= n; ++i) {
    go[i] = i;
    who[i] = i;
  }
  int ans = 0;
  for (auto e : matching) {
    make_swap(e.first, e.second);
    ans += 2;
  }
  for (int i = 1; i <= n; ++i) {
    if (!used[i]) {
      make_swap(i, g[i][0]);
      ans += 2;
    }
  }
  cout << ans << '\n';
  for (int i = 1; i <= n; ++i) {
    cout << go[i] << ' ';
  }
  cout << '\n';
  return 0;
}
