#include <bits/stdc++.h>
using namespace std;
const int MAXN = 500000 + 5;
int n;
vector<int> g[MAXN];
int parent_[MAXN];
int leafcnt[MAXN];
vector<int> leaves;
vector<pair<int,int>> ans;
void dfs_cnt(int u, int p) {
parent_[u] = p;
if ((int)g[u].size() == 1 && p != 0) {
leafcnt[u] = 1;
return;
}
leafcnt[u] = 0;
for (int v : g[u]) {
if (v == p) continue;
dfs_cnt(v, u);
leafcnt[u] += leafcnt[v];
}
}
void dfs_leaves(int u, int p, int root) {
if ((int)g[u].size() == 1 && u != root) {
leaves.push_back(u);
return;
}
for (int v : g[u]) {
if (v == p) continue;
dfs_leaves(v, u, root);
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int i = 1; i <= n - 1; i++) {
int a, b;
cin >> a >> b;
g[a].push_back(b);
g[b].push_back(a);
}
if (n == 2) {
cout << 1 << '\n';
cout << 1 << ' ' << 2 << '\n';
return 0;
}
dfs_cnt(1, 0);
int totalLeaves = leafcnt[1];
int c = 1;
while (true) {
int nxt = -1;
for (int v : g[c]) {
if (v == parent_[c]) continue;
if (leafcnt[v] > totalLeaves / 2) {
nxt = v;
break;
}
}
if (nxt == -1) break;
c = nxt;
}
for (int v : g[c]) {
dfs_leaves(v, c, c);
}
int m = (int)leaves.size();
int k = m / 2;
for (int i = 0; i < k; i++) {
ans.push_back({leaves[i], leaves[i + k]});
}
if (m % 2 == 1) {
ans.push_back({leaves[m - 1], leaves[0]});
}
cout << ans.size() << '\n';
for (auto [u, v] : ans) {
cout << u << ' ' << v << '\n';
}
return 0;
}