#include <bits/stdc++.h>   using namespace std;   int u, v;   const int maxn = 5e3 + 10;   vector<long long> G[maxn];   bool visited[maxn];   long long dp[maxn];   vector<long long> vc[maxn];   bool mark[maxn];   long long n;   vector<long long> ans;   void dfs(int x) {     visited[x] = 1;     for (int i = 0; i != G[x].size(); i++) {       if (visited[G[x][i]] == 0) {         dfs(G[x][i]);         dp[x] += 1 + dp[G[x][i]];       }     }   }   void main_dfs(int x) {     visited[x] = 1;     memset(mark, 0, sizeof(mark));     for (int i = 0; i < G[x].size(); i++) {       if (visited[G[x][i]] == 0) {         int g = vc[x].size();         for (int j = 0; j < g; j++) {           if (vc[x][j] + dp[G[x][i]] + 1 != n - 1 &&               mark[vc[x][j] + dp[G[x][i]] + 1] == 0) {             vc[x].push_back(vc[x][j] + dp[G[x][i]] + 1);             mark[vc[x][j] + dp[G[x][i]] + 1] = 1;           }         }         if (dp[G[x][i]] + 1 != n - 1 && mark[dp[G[x][i]] + 1] == 0) {           vc[x].push_back(dp[G[x][i]] + 1);           mark[dp[G[x][i]] + 1] = 1;         }       } else {         int g = vc[x].size();         for (int j = 0; j < g; j++) {           if (mark[vc[x][j] + n - 1 - dp[x]] == 0)             if (vc[x][j] + n - 1 - dp[x] != 0 &&                 vc[x][j] + n - 1 - dp[x] != n - 1) {               vc[x].push_back(vc[x][j] + n - dp[x] - 1);               mark[vc[x][j] + n - dp[x] - 1] = 1;             }         }         if (mark[n - dp[x] - 1] == 0)           if (n - dp[x] - 1 != 0 && n - dp[x] - 1 != n - 1) {             vc[x].push_back(n - dp[x] - 1);             mark[n - dp[x] - 1] = 1;           }       }     }     for (int i = 0; i != G[x].size(); i++) {       if (visited[G[x][i]] == 0) main_dfs(G[x][i]);     }   }   bool mk[maxn];   int main() {     ios_base::sync_with_stdio(false);     cin.tie(NULL);     cout.tie(NULL);     cin >> n;     for (int i = 0; i != n - 1; i++) {       cin >> u >> v;       G[u].push_back(v);       G[v].push_back(u);     }     dfs(1);     fill(visited, visited + maxn, 0);     main_dfs(1);     for (int i = 1; i != n + 1; i++) {       for (int j = 0; j != vc[i].size(); j++) {         if (find(ans.begin(), ans.end(), vc[i][j]) == ans.end()) {           ans.push_back(vc[i][j]);           if (n - 1 - vc[i][j] != vc[i][j]) ans.push_back(n - 1 - vc[i][j]);         }       }     }     sort(ans.begin(), ans.end());     cout << ans.size() << endl;     for (int i = 0; i != ans.size(); i++) {       cout << ans[i] <<     << n - 1 - ans[i] << endl;     }   }   