#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
const int maxn = 2e5 + 10;
int dp[2][maxn], dp1[2][maxn];
vector<int> g[maxn];
set<pair<int, int>> edges;
void Dfs(int u, int pr = 0) {
  if (pr) {
    if (edges.find({pr, u}) != edges.end()) {
      dp1[0][u] += 1;
    } else {
      dp1[1][u] += 1;
    }
    dp1[0][u] += dp1[0][pr];
    dp1[1][u] += dp1[1][pr];
  }
  for (int v : g[u]) {
    if (v == pr) {
      continue;
    }
    Dfs(v, u);
    if (edges.find({u, v}) != edges.end()) {
      dp[0][u] += 1;
    } else {
      dp[1][u] += 1;
    }
    dp[0][u] += dp[0][v];
    dp[1][u] += dp[1][v];
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  int n;
  cin >> n;
  for (int i = 0; i < n - 1; i++) {
    int u, v;
    cin >> u >> v;
    edges.emplace(u, v);
    g[u].push_back(v);
    g[v].push_back(u);
  }
  Dfs(1);
  vector<int> ans;
  int nin = (int)(2e9);
  for (int i = 1; i <= n; i++) {
    int cur = dp[1][1] - dp1[1][i] + dp1[0][i];
    if (cur < nin) {
      nin = cur;
      ans.clear();
      ans.push_back(i);
    } else if (cur == nin)
      ans.push_back(i);
  }
  cout << nin << "\n";
  for (auto i : ans) cout << i << " ";
  cout << "\n";
  exit(0);
}
