#include <bits/stdc++.h>
using namespace std;
const int N = 200000 + 10;
struct node {
  vector<int> children;
  vector<int> road;
  int color;
  int parentDay;
};
node lst[N];
int main() {
  int n, i, j;
  scanf("%d", &n);
  for (i = 1; i <= n; i++) {
    lst[i].color = lst[i].parentDay = 0;
  }
  int ans = 0;
  for (i = 1; i < n; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    lst[u].children.push_back(v);
    lst[v].children.push_back(u);
    lst[u].road.push_back(i);
    lst[v].road.push_back(i);
  }
  for (i = 1; i <= n; i++) ans = max(ans, (int)lst[i].children.size());
  vector<vector<int> > v(ans + 1);
  queue<int> q;
  q.push(1);
  lst[1].color = 1;
  while (!q.empty()) {
    int t = q.front();
    q.pop();
    j = 1;
    for (i = 0; i < lst[t].children.size(); i++) {
      int idx = lst[t].children[i];
      if (lst[idx].color == 0) {
        if (j == lst[t].parentDay) j++;
        q.push(idx);
        lst[idx].color = 1;
        v[j].push_back(lst[t].road[i]);
        lst[idx].parentDay = j++;
      }
    }
  }
  printf("%d\n", ans);
  for (i = 1; i <= ans; i++) {
    printf("%d", v[i].size());
    for (j = 0; j < v[i].size(); j++) printf(" %d", v[i][j]);
    printf("\n");
  }
  return 0;
}
