#include <bits/stdc++.h>
using namespace std;
const int N = 1 << 17;
vector<int> g[N];
int n;
bool solve() {
  if (n == 2) return cout << "2\n1 2\n", true;
  int leaves = 1 << (n - 1), nodes = (1 << n) - 2;
  vector<int> c(5);
  for (int i = int(0); i < int(nodes); i++) {
    int x = int((g[i]).size());
    if (x > 4) return false;
    c[x]++;
  }
  if (c[1] == leaves && c[3] == nodes - leaves) {
    vector<int> h(nodes, -1), res;
    queue<int> q;
    for (int i = int(0); i < int(nodes); i++)
      if (int((g[i]).size()) == 1) h[i] = 0, q.push(i);
    while (!q.empty()) {
      int u = q.front();
      q.pop();
      for (int v : g[u])
        if (h[v] == -1) {
          h[v] = h[u] + 1, q.push(v);
          if (h[v] >= n - 1) return false;
          if (h[v] == n - 2) res.emplace_back(v + 1);
        }
    }
    if (int((res).size()) == 2) {
      sort(res.begin(), res.end());
      cout << 2 << endl;
      cout << res[0] << ' ' << res[1] << endl;
    } else
      return false;
  } else if (c[1] == leaves - 1 && c[2] == 2 && c[4] == 0) {
    int root = -1, res = -1;
    for (int i = int(0); i < int(nodes); i++)
      if (int((g[i]).size()) == 2) {
        if (int((g[g[i][0]]).size()) > 1 && int((g[g[i][1]]).size()) > 1)
          root = i;
        else
          res = i + 1;
      }
    vector<int> d(nodes);
    stack<pair<int, int> > s;
    s.emplace(root, 0), d[root] = 1;
    while (!s.empty()) {
      int u, i;
      tie(u, i) = s.top(), s.pop();
      int sz = int((g[u]).size()), v;
      while (i < sz && d[v = g[u][i]]) i++;
      if (i < sz) {
        d[v] = d[u] + 1;
        if (d[v] > n) return false;
        if (i + 1 < sz) s.emplace(u, i + 1);
        s.emplace(v, 0);
      }
    }
    cout << "1\n" << res << endl;
  } else if (c[1] == leaves && c[2] == 1 && c[4] == 1) {
    int root = -1, res = -1;
    for (int i = int(0); i < int(nodes); i++) {
      if (int((g[i]).size()) == 2) root = i;
      if (int((g[i]).size()) == 4) res = i;
    }
    vector<int> d(nodes, -1), h(nodes), l(n), cr;
    vector<bool> vis(nodes);
    stack<pair<int, int> > s;
    s.emplace(root, 0);
    while (!s.empty()) {
      int u, v, i, sz;
      tie(u, i) = s.top(), s.pop(), sz = int((g[u]).size());
      if (i) {
        h[u] = max(h[u], h[g[u][i - 1]] + 1);
        if (h[u] >= n) return false;
      } else
        vis[u] = true;
      while (i < sz && vis[v = g[u][i]]) i++;
      if (i < sz) {
        if (u == res) cr.emplace_back(v);
        s.emplace(u, i + 1), s.emplace(v, 0);
      }
    }
    int m = -1;
    for (int i = int(0); i < int(3); i++) {
      bool c1 = h[cr[i]] == h[cr[(i + 1) % 3]];
      bool c2 = h[cr[i]] < h[cr[(i + 2) % 3]];
      if (c1 && c2) m = cr[(i + 2) % 3];
    }
    if (m == -1) return false;
    s.emplace(root, 0), d[root] = 0;
    while (!s.empty()) {
      int u, v, i, sz;
      tie(u, i) = s.top(), s.pop(), sz = int((g[u]).size());
      while (i < sz && d[v = g[u][i]] != -1) i++;
      if (i < sz) {
        d[v] = d[u] + 1;
        if (u == res && v != m) d[v]++;
        l[d[v]]++;
        if (v == res) l[d[v] + 1]++;
        s.emplace(u, i + 1), s.emplace(v, 0);
      }
    }
    for (int i = int(1); i < int(n); i++)
      if (l[i] != (1 << i)) return false;
    cout << "1\n" << res + 1 << endl;
  } else
    return false;
  return true;
}
int main() {
  ios_base::sync_with_stdio(0), cin.tie(0);
  cin >> n;
  int m = (1 << n) - 3;
  while (m--) {
    int x, y;
    cin >> x >> y;
    x--, y--;
    g[x].emplace_back(y), g[y].emplace_back(x);
  }
  if (!solve()) cout << 0 << endl;
  return 0;
}
