#include <bits/stdc++.h>   using namespace std;   const int N = 2e5;   vector<int> graph[N];   int pa[N];   int getHeight(int u, int pre) {     int res = 1;     pa[u] = pre;     for (auto e : graph[u]) {       if (e == pre) {         continue;       }       int subHeight = getHeight(e, u);       res = max(res, subHeight + 1);     }     return res;   }   bool checkBanalance(int u, int pre, int &height) {     if (graph[u].size() == 1) {       height = 0;       return true;     }     int h[2];     int idx = 0;     for (auto e : graph[u]) {       if (e == pre) {         continue;       }       bool ret = checkBanalance(e, u, h[idx++]);       if (!ret) {         return false;       }     }     height = h[0] + 1;     if (h[0] != h[1]) {       return false;     }     return true;   }   int d[N];   int maxDepth = 0;   int maxNode = 0;   int getDepth(int u, int pre) {     d[u] = d[pre] + 1;     pa[u] = pre;     for (auto e : graph[u]) {       if (e == pre) {         continue;       }       getDepth(e, u);     }     if (d[u] > maxDepth) {       maxDepth = d[u];       maxNode = u;     }     return d[u];   }   int main() {     int n;     scanf( %d , &n);     int nodeErase = (1 << n) - 1;     int u, v;     for (int i = 1; i <= (1 << n) - 3; i++) {       scanf( %d%d , &u, &v);       graph[u].push_back(v);       graph[v].push_back(u);     }     if (n == 2) {       printf( 2 n );       printf( 1 2 n );       return 0;     }     vector<int> cnt[5];     int res;     int root;     for (int i = 1; i <= (1 << n) - 2; i++) {       int degree = graph[i].size();       if (degree > 4 || degree < 1) {         do {           printf( 0 n );           return 0;         } while (0);         ;       }       cnt[degree].push_back(i);     }     if (cnt[4].size() > 1 || cnt[2].size() > 2) {       do {         printf( 0 n );         return 0;       } while (0);       ;     } else if (cnt[4].size() == 1) {       if (cnt[2].size() != 1) {         do {           printf( 0 n );           return 0;         } while (0);         ;       }       root = cnt[2][0];       res = cnt[4][0];       getHeight(root, 0);       pair<int, int> h[4];       int idx = 0;       for (auto e : graph[res]) {         if (e == pa[res]) {           continue;         }         h[idx++] = make_pair(getHeight(e, res), e);       }       sort(h, h + 3);       if (!(h[0].first == h[1].first && h[2].first == h[1].first + 1)) {         do {           printf( 0 n );           return 0;         } while (0);         ;       }       graph[h[0].second].push_back(nodeErase);       graph[h[1].second].push_back(nodeErase);       graph[res].push_back(nodeErase);       graph[nodeErase].push_back(h[0].second);       graph[nodeErase].push_back(h[1].second);       graph[nodeErase].push_back(res);       graph[res].erase(find(graph[res].begin(), graph[res].end(), h[0].second));       graph[res].erase(find(graph[res].begin(), graph[res].end(), h[1].second));       graph[h[0].second].erase(           find(graph[h[0].second].begin(), graph[h[0].second].end(), res));       graph[h[1].second].erase(           find(graph[h[1].second].begin(), graph[h[1].second].end(), res));     } else if (cnt[4].size() == 0 && cnt[2].size() == 2) {       for (int i = 0; i < 2; i++) {         root = cnt[2][i];         res = cnt[2][1 - i];         int h1 = getHeight(graph[root][0], 0);         int h2 = getHeight(graph[root][1], 0);         if (h1 == h2) {           break;         }       }       graph[res].push_back(nodeErase);       graph[nodeErase].push_back(res);     } else if (cnt[4].size() == 0 && cnt[2].size() == 0) {       u = cnt[1][0];       getDepth(u, 0);       int t = (maxDepth - 1) / 2;       v = maxNode;       for (int i = 0; i < t; i++) {         v = pa[v];       }       u = pa[v];       int height = 0;       if (checkBanalance(u, v, height) && checkBanalance(v, u, height)) {         if (u > v) {           swap(u, v);         }         printf( 2 n%d %d n , u, v);         return 0;       } else {         do {           printf( 0 n );           return 0;         } while (0);         ;       }     } else {       do {         printf( 0 n );         return 0;       } while (0);       ;     }     int height = 0;     bool ret = checkBanalance(root, 0, height);     if (ret) {       printf( 1 n%d n , res);     } else {       do {         printf( 0 n );         return 0;       } while (0);       ;     }     return 0;   }