#include <bits/stdc++.h>
using namespace std;
long long M = 1e9 + 7;
long long MOD = 1e9 + 7;
long long powermod(long long x, long long y) {
  long long res = 1;
  x = x % MOD;
  if (x == 0) return 0;
  while (y > 0) {
    if (y & 1) res = (res * x) % MOD;
    y = y >> 1;
    x = (x * x) % MOD;
  }
  return res;
}
long long modinv(long long x) { return powermod(x, MOD - 2); }
int findset(int p[], int x) {
  if (x != p[x]) {
    p[x] = findset(p, p[x]);
  }
  return p[x];
}
void unionset(int p[], int r[], int a, int b) {
  int x = findset(p, a);
  int y = findset(p, b);
  if (x != y) {
    if (r[x] < r[y]) swap(x, y);
    p[y] = x;
    if (r[x] == r[y]) {
      r[x]++;
    }
  }
}
void dfs(vector<int> v[], int s[], int x) {
  int S = 1;
  for (int i = 0; i < v[x].size(); i++) {
    dfs(v, s, v[x][i]);
    S += s[v[x][i]];
  }
  s[x] = S;
}
long long f[100005];
void preprocess() {
  f[0] = 1;
  for (int i = 1; i < 100005; i++) {
    f[i] = (f[i - 1] * i) % MOD;
    if (i % 2 == 0) f[i] /= 2;
  }
}
void dfs(int x, int a[], vector<int> v[], vector<int> &vi, int &ans) {
  vi[x] = 1;
  for (int i = 0; i < v[x].size(); i++) {
    if (vi[v[x][i]] == -1) {
      dfs(v[x][i], a, v, vi, ans);
      if (vi[v[x][i]] == 1) {
        swap(a[x], a[v[x][i]]);
        ans += 2;
        vi[x] = 0;
      }
    }
  }
}
void solve() {
  int n;
  cin >> n;
  vector<int> v[n];
  int x, y;
  int a[n];
  for (int i = 0; i < n - 1; i++) {
    cin >> x >> y;
    x--;
    y--;
    v[x].push_back(y);
    v[y].push_back(x);
    a[i] = i + 1;
  }
  a[n - 1] = n;
  vector<int> vi(n, -1);
  int ans = 0;
  dfs(0, a, v, vi, ans);
  if (vi[0] == 1) {
    swap(a[0], a[v[0][0]]);
    ans += 2;
  }
  cout << ans << endl;
  for (int i = 0; i < n; i++) {
    cout << a[i] << ' ';
  }
  cout << endl;
}
int main() {
  long long q = 1;
  time_t start, end;
  time(&start);
  for (long long tc = 1; tc <= q; tc++) {
    solve();
  }
  time(&end);
  return 0;
}
