#include <bits/stdc++.h>
using namespace std;
long double EPS = 1e-9;
long long cel(long long a, long long b) { return ((a - 1) / b + 1); }
long long gcd(long long a, long long b) {
  if (a < b) swap(a, b);
  return (b == 0) ? a : gcd(b, a % b);
}
long long lcm(long long a, long long b) { return (a * b) / gcd(a, b); }
long long po(long long x, long long y) {
  long long ans = 1;
  while (y) {
    if (y & 1) {
      ans = (ans * x) % 1000000007;
    }
    y >>= 1;
    x = (x * x) % 1000000007;
  }
  return ans;
}
vector<int> ans(5001, 0), ch(5001, 0), adj[5001];
int n;
void se(vector<int> &v) {
  int n1 = v.size();
  bool dp[n1 + 1][5001];
  memset((dp), 0, sizeof(dp));
  for (int i = 1; i < n1 + 1; i++) {
    dp[i][v[i - 1]] = true;
    for (int j = 1; j < 5001; j++) {
      if (dp[i - 1][j]) {
        dp[i][j] = true;
        dp[i][j + v[i - 1]] = true;
      }
    }
  }
  for (int i = 1; i < 5001; i++) {
    if (dp[n1][i] && (i != (n - 1))) ans[i] = 1;
  }
}
void dfs(int u, int par) {
  vector<int> chk;
  for (int t : adj[u]) {
    if (t == par) continue;
    dfs(t, u);
    chk.push_back(ch[t]);
    ch[u] += ch[t];
  }
  if (!chk.empty()) {
    chk.push_back((n - 1) - ch[u]);
    se(chk);
  }
  ch[u]++;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int x, y;
  cin >> n;
  for (int i = 0; i < n - 1; i++) {
    cin >> x >> y;
    adj[x].push_back(y);
    adj[y].push_back(x);
  }
  dfs(1, -1);
  x = 0;
  for (int i = 1; i < n - 1; i++) {
    if (ans[i] || (ans[n - 1 - i])) x++;
  }
  cout << x << "\n";
  for (int i = 1; i < n - 1; i++) {
    if (ans[i] || (ans[n - 1 - i])) {
      cout << i << " " << n - 1 - i << "\n";
    }
  }
  return 0;
}
