#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using vi = vector<int>;
using vb = vector<bool>;
using vc = vector<char>;
using vvc = vector<vc>;
using vvi = vector<vi>;
using vvb = vector<vb>;
using vpii = vector<pii>;
using vpll = vector<pll>;
using vll = vector<ll>;
using vvll = vector<vll>;
using vull = vector<ull>;
constexpr int INF = 1e9 + 1e7;
constexpr ll INFl = INF;
constexpr ll INFll = 1e18 + 1e16;
void print() { cout << '\n'; }
template <typename T, typename... Args>
void print(T x, Args... args) {
  cout << x << ' ';
  print(args...);
}
void read() {}
template <typename T, typename... Args>
void read(T x, Args... args) {
  cin >> x;
  read(args...);
}
template <typename T1, typename T2>
ostream& operator<<(ostream& os, pair<T1, T2> x) {
  os << '(' << x.first << ' ' << x.second << ')';
  return os;
}
template <typename T1, typename T2>
istream& operator>>(istream& is, pair<T1, T2>& x) {
  is >> x.first >> x.second;
  return is;
}
template <typename T>
ostream& operator<<(ostream& os, vector<T>& x) {
  for (T& i : x) os << i << ' ';
  return os;
}
template <typename T>
istream& operator>>(istream& is, vector<T>& x) {
  for (T& i : x) is >> i;
  return is;
}
template <typename T1, typename T2>
pair<T1, T2> operator+(const pair<T1, T2>& A, const pair<T1, T2>& B) {
  return {A.first + B.first, A.second + B.second};
}
template <typename T1, typename T2>
pair<T1, T2> operator-(const pair<T1, T2>& A, const pair<T1, T2>& B) {
  return {A.first - B.first, A.second - B.second};
}
template <typename T1, typename T2>
pair<T1, T2> operator-(const pair<T1, T2>& A) {
  return {-A.first, -A.second};
}
template <typename T1, typename T2>
bool maxe(T1& A, const T2& B) {
  if (B > A) {
    A = B;
    return 1;
  }
  return 0;
}
template <typename T1, typename T2>
bool mine(T1& A, const T2& B) {
  if (B < A) {
    A = B;
    return 1;
  }
  return 0;
}
struct vertex {
  vi e;
  int R;
};
int n;
vector<vertex> G;
void in() {
  cin >> n;
  G.resize(n + 1);
  for (auto i = (2); i <= (n); ++i) {
    int a, b;
    cin >> a >> b;
    G[a].e.emplace_back(b);
    G[b].e.emplace_back(a);
  }
  for (auto i = (1); i <= (n); ++i) G[i].R = i;
}
ll R = 0;
void dfs(int v, int p) {
  for (auto u : G[v].e)
    if (u != p) dfs(u, v);
  if (G[v].R == v) {
    swap(G[v].R, G[p].R);
    R += 2;
  }
}
ll solve() {
  dfs(1, 1);
  if (G[1].R == 1) swap(G[1].R, G[G[1].e[0]].R);
  print(R);
  for (auto i = (1); i <= (n); ++i) cout << G[i].R << ' ';
  cout << '\n';
  return -INF;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int noOfTests = 1;
  while (noOfTests-- > 0) {
    in();
    ll result = solve();
    if (result == ll(-'t'))
      cout << "TAK\n";
    else if (result == ll(-'n'))
      cout << "NIE\n";
    else if (result == ll(-'y'))
      cout << "YES\n";
    else if (result == ll(-'o'))
      cout << "NO\n";
    else if (result == ll(-'e'))
      cout << "Popsute\n";
    else if (result != -INF)
      cout << result << '\n';
  }
  return 0;
}
