#include using namespace std; vector dfs(int u, int p, const vector> &g, vector> &pairs) { // TODO: fix calling this from the root node. if(g[u].size() == 1) return {u}; vector ret, last; for(auto w : g[u]) if(w != p){ auto v = dfs(w, u, g, pairs); if(ret.size() == 0){ ret.push_back(v.back()); v.pop_back(); } while(!last.empty() && !v.empty()){ pairs.push_back({last.back(), v.back()}); last.pop_back(); v.pop_back(); } for(auto x : v){ last.push_back(x); } } for(auto x : last) ret.push_back(x); assert(ret.size() <= 3); if(ret.size() == 3){ pairs.push_back({ret[0], ret[2]}); ret[0] = ret[1]; ret.resize(1); } assert(ret.size() > 0 && ret.size() <= 2); if(p == -1){ if(ret.size() == 2) pairs.push_back({ret[0], ret[1]}); else if(ret.size() == 1){ pairs.push_back({ret[0], pairs.back().second}); } } return ret; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int n, p; cin >> n >> p; if(n == 2){ cout << "1\n0 1\n"; return 0; } vector> g(n); vector> pairs; for(int i = 0; i < n - 1; ++i) { int u, v; cin >> u >> v; g[u].push_back(v); g[v].push_back(u); } int root = 0; while(g[root].size() == 1) ++root; dfs(root, -1, g, pairs); cout << pairs.size() << '\n'; for(auto p : pairs) cout << p.first << ' ' << p.second << '\n'; return 0; }