#include <bits/stdc++.h>
using namespace std;
struct Diameter {
  vector<int> center;
  int N;
  pair<vector<int>, vector<int>> calc_dist(int start, const vector<int> G[]) {
    vector<int> dist(N, -1), prev(N);
    dist[start] = 0;
    prev[start] = -1;
    queue<int> que;
    que.push(start);
    while (que.size()) {
      int i = que.front();
      que.pop();
      for (auto j : G[i]) {
        if (dist[j] == -1) {
          dist[j] = dist[i] + 1;
          prev[j] = i;
          que.push(j);
        }
      }
    }
    return {dist, prev};
  }
  int calculate(int n, const vector<int> G[]) {
    N = n;
    auto res1 = calc_dist(0, G);
    auto d1 = res1.first;
    int v1 = max_element(d1.begin(), d1.end()) - d1.begin();
    auto res2 = calc_dist(v1, G);
    auto d2 = res2.first;
    auto p2 = res2.second;
    int v2 = max_element(d2.begin(), d2.end()) - d2.begin();
    int diam = d2[v2];
    while (v2 != -1) {
      if (d2[v2] == diam / 2 || d2[v2] == (diam + 1) / 2) center.push_back(v2);
      v2 = p2[v2];
    }
    return diam;
  }
};
int N, V;
vector<int> edges[150000];
vector<int> ans;
int dfs(int i, int p, int d, int& cand, set<int>& sht) {
  vector<pair<int, int>> child;
  for (int j : edges[i])
    if (j != p) {
      int ret = dfs(j, i, d + 1, cand, sht);
      if (ret == -1) return -1;
      child.emplace_back(ret, j);
    }
  int sz = child.size();
  if (sz == 0) {
    return 0;
  } else if (sz == 1) {
    if (cand == -1 && d == N - 2 && child[0].first == 0) {
      cand = i;
      return 1;
    } else {
      return -1;
    }
  } else if (sz == 2) {
    if (child[0].first == child[1].first) {
      return child[0].first + 1;
    } else {
      return -1;
    }
  } else if (sz == 3) {
    sort(child.begin(), child.end());
    if (cand == -1 && child[0].first == child[1].first &&
        child[0].first + 1 == child[2].first) {
      cand = i;
      sht.insert(child[0].second);
      sht.insert(child[1].second);
      return child[2].first + 1;
    } else {
      return -1;
    }
  } else {
    return -1;
  }
}
bool check(int i, int p, int d, int cand, set<int>& sht) {
  int ch = 0;
  for (int j : edges[i])
    if (j != p) {
      ch++;
      if (!check(j, i, d + 1 + sht.count(j), cand, sht)) return false;
    }
  if (ch == 0) return (d == N - 1);
  if (cand == i) {
    return (ch == (d == N - 2 ? 1 : 3));
  } else {
    return ch == 2;
  }
}
int main() {
  cin >> N;
  V = (1 << N) - 2;
  for (int i = 0; i < V - 1; i++) {
    int a, b;
    cin >> a >> b;
    edges[a - 1].push_back(b - 1);
    edges[b - 1].push_back(a - 1);
  }
  Diameter diam;
  diam.calculate(V, edges);
  for (int c : diam.center) {
    int cand = -1;
    set<int> sht;
    int res = dfs(c, -1, 0, cand, sht);
    if (res == N - 1 && cand >= 0 && check(c, -1, 0, cand, sht))
      ans.push_back(cand);
  }
  int sz = ans.size();
  cout << sz << endl;
  sort(ans.begin(), ans.end());
  for (int i = 0; i < sz; i++) cout << ans[i] + 1 << " \n"[i == sz - 1];
  return 0;
}
