#include <bits/stdc++.h>
using namespace std;
const int MaxN = 2e5;
int n, all;
int pre[2 * MaxN + 5], last[MaxN + 5], other[2 * MaxN + 5];
bool vis[MaxN + 5];
int ans[2 * MaxN + 5], num[2 * MaxN + 5], seq[2 * MaxN + 5], used[MaxN + 5];
vector<int> v[MaxN + 5];
void build(int x, int y, int k) {
  pre[++all] = last[x];
  last[x] = all;
  other[all] = y;
  num[all] = k;
}
void bfs(int s) {
  memset(vis, 0, sizeof(vis));
  for (int i = 1; i <= n; i++) v[i].clear();
  int head = 1, tail = 0;
  seq[++tail] = s;
  vis[s] = 1;
  while (head <= tail) {
    int now = seq[head];
    int ed = last[now], dr;
    int tot = 0;
    while (ed != -1) {
      dr = other[ed];
      if (!vis[dr]) {
        ++tot;
        if (used[now] == tot) ++tot;
        ans[num[ed]] = tot;
        used[dr] = tot;
        seq[++tail] = dr;
        vis[dr] = 1;
      }
      ed = pre[ed];
    }
    head++;
  }
  int Max = 0;
  for (int i = 1; i <= n - 1; i++) {
    v[ans[i]].push_back(i);
    Max = max(Max, ans[i]);
  }
  printf("%d\n", Max);
  for (int i = 1; i <= Max; i++) {
    printf("%d ", v[i].size());
    for (int j = 0; j < v[i].size(); j++) {
      printf("%d ", v[i][j]);
    }
    printf("\n");
  }
}
int main() {
  while (~scanf("%d", &n)) {
    all = -1;
    memset(last, -1, sizeof(last));
    for (int i = 1; i <= n - 1; i++) {
      int u, v;
      scanf("%d%d", &u, &v);
      build(u, v, i);
      build(v, u, i);
    }
    bfs(1);
  }
  return 0;
}
