#include <bits/stdc++.h>
using namespace std;
const int INF = 1029384756;
const double PI = acos(-1);
const double EPS = 0.0000000304;
const int MAXV = 5432;
int V;
vector<int> el[MAXV], sn[MAXV];
bool nc[MAXV];
bool ans[MAXV];
void rainbow(int v1, int v2) { el[v1].push_back((v2)); }
int meteor(int nv, int fa) {
  int t = 0, s = 0;
  for (int(i) = 0; (i) < (el[nv].size()); (i)++) {
    int ns = el[nv][i];
    if (ns != fa) {
      t = meteor(ns, nv);
      sn[nv].push_back((t));
      s += t;
    }
  }
  sn[nv].push_back((V - s - 1));
  return s + 1;
}
int main() {
  scanf("%d", &V);
  for (int(i) = 0; (i) < (V - 1); (i)++) {
    int v1, v2;
    scanf("%d %d", &v1, &v2);
    rainbow(v1, v2);
    rainbow(v2, v1);
  }
  meteor(1, -1);
  for (int(i) = (1); (i) < (V + 1); (i)++) {
    memset((nc), 0, sizeof(nc));
    nc[0] = 1;
    for (int(j) = 0; (j) < (sn[i].size()); (j)++) {
      int t = sn[i][j];
      for (int(k) = ((V - t) - 1); (k) >= 0; (k)--) {
        if (nc[k]) {
          nc[k + t] = 1;
        }
      }
    }
    for (int(j) = 0; (j) < (V); (j)++) {
      if (nc[j]) {
        ans[j] = 1;
      }
    }
  }
  int ct = 0;
  for (int(i) = (1); (i) < (V - 1); (i)++) {
    if (ans[i]) {
      ct++;
    }
  }
  printf("%d\n", ct);
  for (int(i) = (1); (i) < (V - 1); (i)++) {
    if (ans[i]) {
      printf("%d %d\n", i, V - i - 1);
    }
  }
  return 0;
}
