#include <bits/stdc++.h>
using namespace std;
const int N = 111111;
int n, out[N];
long long dp[N][2];
vector<int> G[N];
vector<int> opt[N][2];
bool vis[N];
void dfs(int v, int p) {
  if ((int)G[v].size() == 1 && G[v][0] == p) {
    dp[v][1] = 0;
    dp[v][0] = 1e7;
    return;
  }
  long long S = 0;
  vector<pair<long long, int>> ord;
  for (auto u : G[v]) {
    if (u == p) continue;
    dfs(u, v);
    S += dp[u][0];
    ord.push_back({-dp[u][0] + dp[u][1] + 2, u});
  }
  sort(ord.begin(), ord.end());
  dp[v][1] = S;
  int j = 0;
  while (j + 1 < (int)ord.size() && ord[j].first + ord[j + 1].first < 0) {
    dp[v][1] += ord[j].first + ord[j + 1].first;
    opt[v][1].push_back(ord[j].second);
    opt[v][1].push_back(ord[j + 1].second);
    j += 2;
  }
  vector<int> now = {ord[0].second};
  long long s1 = S + ord[0].first;
  j = 1;
  while (j + 1 < (int)ord.size() && ord[j].first + ord[j + 1].first < 0) {
    s1 += ord[j].first + ord[j + 1].first;
    now.push_back(ord[j].second);
    now.push_back(ord[j + 1].second);
    j += 2;
  }
  dp[v][0] = s1;
  opt[v][0] = now;
  if ((int)ord.size() >= 2) {
    s1 = S + ord[0].first + ord[1].first;
    now = {ord[0].second, ord[1].second};
    j = 2;
    while (j + 1 < (int)ord.size() && ord[j].first + ord[j + 1].first < 0) {
      s1 += ord[j].first + ord[j + 1].first;
      now.push_back(ord[j].second);
      now.push_back(ord[j + 1].second);
      j += 2;
    }
    if (s1 < dp[v][0]) {
      dp[v][0] = s1;
      opt[v][0] = now;
    }
  }
  if (S + 2 < dp[v][0]) {
    dp[v][0] = S + 2;
    opt[v][0] = {};
  }
}
void odzyskaj(int v, int p, int k) {
  vis[v] = true;
  for (auto u : opt[v][k]) odzyskaj(u, v, 1);
  for (auto u : G[v])
    if (!vis[u]) odzyskaj(u, v, 0);
  if (k == 1) {
    assert((int)opt[v][1].size() % 2 == 0);
    for (int i = 0; i < (int)opt[v][1].size(); i += 2) {
      int a = opt[v][1][i], b = opt[v][1][i + 1];
      out[a] = b;
      out[b] = a;
    }
  } else {
    if (opt[v][0].empty()) {
      int son = -1;
      for (auto u : G[v])
        if (u != p) {
          son = u;
          break;
        }
      assert(son != -1);
      out[v] = out[son];
      out[son] = v;
    } else if ((int)opt[v][0].size() % 2 == 1) {
      opt[v][0].push_back(v);
      for (int i = 0; i < (int)opt[v][0].size(); i += 2) {
        int a = opt[v][0][i], b = opt[v][0][i + 1];
        out[a] = b;
        out[b] = a;
      }
    } else {
      for (int i = 0; i < (int)opt[v][0].size(); i += 2) {
        int a = opt[v][0][i], b = opt[v][0][i + 1];
        if (i != 0) {
          out[a] = b;
          out[b] = a;
        } else {
          out[a] = v;
          out[v] = b;
          out[b] = a;
        }
      }
    }
  }
}
int main() {
  scanf("%d", &n);
  for (int i = 2; i <= n; ++i) {
    int u, v;
    scanf("%d%d", &u, &v);
    G[u].push_back(v);
    G[v].push_back(u);
  }
  dfs(1, 0);
  printf("%lld\n", dp[1][0]);
  odzyskaj(1, 0, 0);
  for (int i = 1; i <= n; ++i) printf("%d ", out[i]);
  return 0;
}
