#include <bits/stdc++.h>
using namespace std;
struct edge {
  int v, id, day;
};
vector<edge> g[200100];
vector<int> d[200100];
bool used[200200];
int max_day = 0;
void dfs(int v, int pr_day) {
  int day = 1;
  for (int i = 0; i < g[v].size(); i++) {
    if (day == pr_day) day++;
    if (!used[g[v][i].v]) {
      used[g[v][i].v] = 1;
      g[v][i].day = day;
      max_day = max(max_day, day);
      d[day].push_back(g[v][i].id);
      dfs(g[v][i].v, day);
      day++;
    }
  }
}
int main() {
  int n;
  cin >> n;
  for (int i = 0; i < n - 1; i++) {
    int a, b;
    cin >> a >> b;
    edge e;
    e.v = b;
    e.id = i + 1;
    g[a].push_back(e);
    e.v = a;
    g[b].push_back(e);
  }
  used[1] = 1;
  dfs(1, 0);
  cout << max_day << "\n";
  for (int i = 1; i <= max_day; i++) {
    cout << d[i].size() << " ";
    for (int j = 0; j < d[i].size(); j++) cout << d[i][j] << " ";
    cout << "\n";
  }
  return 0;
}
