#include <bits/stdc++.h>
using namespace std;
int n;
vector<int> vec[5010];
int d[5010];
bool _end[5010];
bool vis[5010];
void dfs(int now, int fa) {
  bool ok = false;
  for (int i = 0; i < vec[now].size(); i++) {
    if (vec[now][i] != fa) {
      dfs(vec[now][i], now);
      d[now] += d[vec[now][i]];
      ok = true;
    }
  }
  d[now]++;
}
int main() {
  cin >> n;
  for (int i = 1; i <= n - 1; i++) {
    int u, v;
    cin >> u >> v;
    vec[u].push_back(v);
    vec[v].push_back(u);
  }
  dfs(1, 0);
  memset(_end, false, sizeof(_end));
  for (int i = 1; i <= n; i++) {
    if (vec[i].size() == 1) {
      continue;
    } else {
      vector<int> aim;
      int sum = 0;
      for (int j = 0; j < vec[i].size(); j++) {
        if (d[vec[i][j]] > d[i]) {
          continue;
        }
        aim.push_back(d[vec[i][j]]);
        sum += d[vec[i][j]];
      }
      aim.push_back(n - 1 - sum);
      memset(vis, false, sizeof(vis));
      vis[0] = true;
      for (int k = 0; k < aim.size(); k++) {
        for (int j = n; j >= 1; j--) {
          if (j >= aim[k] && vis[j - aim[k]] == true) {
            vis[j] = true;
          }
        }
      }
      for (int j = 1; j <= n; j++) {
        if (vis[j] == true) {
          _end[j] = true;
        }
      }
    }
  }
  int cnt = 0;
  for (int i = 1; i <= n; i++) {
    if (i == n - 1) {
      break;
    }
    if (_end[i]) {
      cnt++;
    }
  }
  cout << cnt << endl;
  for (int i = 1; i <= n; i++) {
    if (i == n - 1) {
      break;
    }
    if (_end[i]) {
      cout << i << " " << n - 1 - i << endl;
    }
  }
  return 0;
}
