#include <bits/stdc++.h>
using namespace std;
const int maxNodes = 200005;
map<pair<int, int>, int> edges;
int n, u, v;
vector<vector<int>> adjList(maxNodes);
int needsFixing[maxNodes];
vector<pair<int, int>> ans;
int DFSONE(int node, int parent) {
  int fix = 0;
  int found;
  if (adjList[node].size() == 1 && node != 1) {
    return needsFixing[node] = 0;
  }
  for (int child : adjList[node]) {
    if (child == parent) continue;
    found = edges[{node, child}];
    fix += DFSONE(child, node);
    if (found == 0) fix++;
  }
  return needsFixing[node] = fix;
}
void DFSTWO(int node, int parent, int path, int propagated) {
  if (node != 1) ans.push_back({path + needsFixing[node] + propagated, node});
  if (adjList[node].size() == 1 && node != 1) return;
  int found;
  int toBesent;
  int oneLine;
  for (int child : adjList[node]) {
    if (child == parent) continue;
    found = edges[{node, child}];
    oneLine = path;
    toBesent = propagated + (needsFixing[node] - needsFixing[child] -
                             ((found == 0) ? 1 : 0));
    if (found != 0) oneLine += 1;
    DFSTWO(child, node, oneLine, toBesent);
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin >> n;
  for (int i = 1; i < n; ++i) {
    cin >> u >> v;
    edges.insert({{u, v}, i});
    adjList[u].push_back(v);
    adjList[v].push_back(u);
  }
  DFSONE(1, 0);
  ans.push_back({needsFixing[1], 1});
  DFSTWO(1, 0, 0, 0);
  sort(ans.begin(), ans.end());
  int res = ans[0].first;
  vector<int> nodeInAns;
  for (pair<int, int> p : ans) {
    if (p.first == res) {
      nodeInAns.push_back(p.second);
    } else {
      break;
    }
  }
  cout << res << endl;
  for (int i : nodeInAns) {
    cout << i << " ";
  }
  return 0;
}
