#include using namespace std; struct BCC { // find AVs and bridges in an undirected graph vector> &edges; int V, counter = 0, root; // root and # children of root vector n, l; // nodes,low stack s; int components = 0; BCC(vector> &e) : edges(e), V(e.size()), n(V, -1), l(V, -1) {} void visit(int u, int p) { // also pass the parent l[u] = n[u] = counter++; s.push(u); bool skipped_parent = false; for(auto &v : edges[u]) { if(n[v] == -1) { visit(v, u); if(l[v] > n[u]) { ++components; while(true) { // biconnected component int w = s.top(); s.pop(); // <= ACT HERE if(w == v) break; } } l[u] = min(l[u], l[v]); } else if(skipped_parent || v != p) { l[u] = min(l[u], n[v]); } else { // v==p skipped_parent = true; } } } int run() { for(int u = 0; u < V; ++u) if(n[u] == -1) { root = u; visit(u, -1); if(!s.empty()) { ++components; s = stack(); } } return components; } }; int main() { srand(132423); int n, p; cin >> n >> p; vector> g(n); vector d(n,0), leaves; for(int i = 0; i < n - 1; ++i) { int u, v; cin >> u >> v; ++d[u], ++d[v]; g[u].push_back(v); g[v].push_back(u); } for(int i = 0; i < n; ++i){ if(d[i]==1) leaves.push_back(i); } int ans = (leaves.size() + 1) / 2; cout << ans << '\n'; int loops = 0; do { random_shuffle(leaves.begin(), leaves.end()); auto g2 = g; for(int i = 0; i < ans; ++i){ int u = leaves[2*i]; int v = leaves[(2*i+1)%n]; g2[u].push_back(v); g2[v].push_back(u); } if(BCC(g2).run() == 1) break; ++loops; } while(true); for(int i = 0; i < ans; ++i) cout << leaves[2*i] << ' ' << leaves[(2*i+1)%n] << '\n'; return 0; }