#include <bits/stdc++.h>
using namespace std;
const int N = 18;
int n, nn, good, dp[1 << N], type[1 << N];
vector<int> ans, nei[1 << N], vec[1 << N];
void input() {
  cin >> n;
  nn = (1 << n) - 1;
  for (int i = 0; i < nn - 2; i++) {
    int u, v;
    cin >> u >> v;
    nei[--u].push_back(--v);
    nei[v].push_back(u);
  }
  if (n == 2) {
    cout << "2\n1 2";
    exit(0);
  }
}
void dfs(int v = 0, int par = -1) {
  for (int u : nei[v])
    if (u ^ par) {
      dfs(u, v);
      dp[v] += dp[u];
      vec[v].push_back(dp[u]);
    }
  if (++dp[v] != nn - 1) vec[v].push_back(nn - 1 - dp[v]);
  sort(vec[v].begin(), vec[v].end());
}
void go(int v, int par = -1) {
  vector<int> vec;
  for (int u : nei[v])
    if (u ^ par) {
      go(u, v);
      vec.push_back(type[u]);
    }
  sort(vec.begin(), vec.end());
  if (vec.empty())
    type[v] = 2;
  else if (vec.size() == 1) {
    if (vec[0] == 2) {
      type[v] = 2 * 2 + 1;
      good = v;
    } else
      type[v] = -1;
  } else if (vec.size() == 2) {
    if (vec[0] == vec[1] && vec[0] % 2 == 0)
      type[v] = vec[0] + 2;
    else if (vec[0] % 2 == 0 && vec[0] + 1 == vec[1])
      type[v] = vec[1] + 2;
    else
      type[v] = -1;
  } else if (vec.size() == 3) {
    if (vec[0] == vec[1] && vec[0] + 2 == vec[2] && (vec[0] % 2 == 0)) {
      type[v] = vec[2] + 2 + 1;
      good = v;
    } else
      type[v] = -1;
  } else
    type[v] = -1;
}
void check(int root) {
  go(root);
  if (type[root] != 2 * n + 1) return;
  ans.push_back(good);
}
void solve() {
  for (int v = 0; v < nn - 1; v++)
    if (vec[v].back() == (1 << (n - 1)) - 1) check(v);
}
void output() {
  sort(ans.begin(), ans.end());
  ans.resize(unique(ans.begin(), ans.end()) - ans.begin());
  cout << ans.size() << '\n';
  for (int v : ans) cout << ++v << ' ';
}
int main() {
  ios::sync_with_stdio(false), cin.tie(0);
  input();
  dfs();
  solve();
  output();
  return 0;
}
