#include <bits/stdc++.h>
using namespace std;
int n, in[200005], day[200005];
vector<int> ans[200005];
vector<pair<int, int> > adj[200005];
void dfs(int now, int pre) {
  map<int, int> M;
  for (int i = 0; i < adj[now].size(); i++) {
    int road = adj[now][i].second;
    if (day[road]) {
      M[day[road]] = 1e9;
    }
  }
  int date = 1;
  for (int i = 0; i < adj[now].size(); i++) {
    int road = adj[now][i].second;
    if (day[road] == 0) {
      while (M[date] > 1) ++date;
      M[date] = 1e9;
      day[road] = date;
    }
  }
  for (int i = 0; i < adj[now].size(); i++) {
    int next = adj[now][i].first;
    if (next != pre) dfs(next, now);
  }
}
int main() {
  scanf("%d", &n);
  for (int a, b, i = 1; i <= n - 1; i++) {
    scanf("%d %d", &a, &b);
    adj[a].push_back(make_pair(b, i));
    adj[b].push_back(make_pair(a, i));
    ++in[a];
    ++in[b];
  }
  int maxi = 0, V = 0;
  for (int i = 1; i <= n; i++) {
    if (maxi < in[i]) {
      maxi = in[i];
      V = i;
    }
  }
  dfs(V, -1);
  cout << maxi << endl;
  for (int i = 1; i <= n - 1; i++) {
    ans[day[i]].push_back(i);
  }
  for (int i = 1; i <= maxi; i++) {
    cout << (int)ans[i].size();
    for (int j = 0; j < ans[i].size(); j++) printf(" %d", ans[i][j]);
    puts("");
  }
}
