#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
/**
* BOI 2015 - Network
* Murakkablik: O(N)
*/
const int MAXN = 500005;
vector<int> adj[MAXN];
vector<int> leaves;
// DFS orqali barcha barglarni tartib bilan yig'ish
void find_leaves(int u, int p) {
if (adj[u].size() == 1) {
leaves.push_back(u);
}
for (int v : adj[u]) {
if (v != p) find_leaves(v, u);
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int n;
cin >> n;
for (int i = 0; i < n - 1; i++) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
// Agar n=2 bo'lsa (shartda n>=3 deyilgan)
if (n == 2) {
cout << "1\n1 2\n";
return 0;
}
// Barg bo'lmagan ixtiyoriy tugunni ildiz sifatida tanlaymiz
int root = 1;
while (adj[root].size() == 1) root++;
find_leaves(root, -1);
int m = leaves.size();
int k = (m + 1) / 2;
cout << k << "\n";
for (int i = 0; i < k; i++) {
// Barglarni o'rtasidan bo'lib juftlash
int u = leaves[i];
int v = leaves[i + m / 2];
cout << u << " " << v << "\n";
}
return 0;
}