#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 5;
const int INF = 0x3f3f3f3f;
int n, du[MAXN];
struct Edge {
  int to, next;
} G[MAXN << 1];
int sz, head[MAXN];
void add(int u, int v) {
  G[sz] = {v, head[u]};
  head[u] = sz++;
}
vector<int> ret[MAXN];
void dfs(int u, int fa, int last) {
  int now = 1;
  for (int i = head[u]; ~i; i = G[i].next) {
    int v = G[i].to;
    if (v == fa) continue;
    now += now == last;
    ret[now].push_back(i / 2);
    dfs(v, u, now);
    now++;
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin >> n;
  for (int i = 1; i <= n; i++) head[i] = -1;
  for (int i = 1, u, v; i < n; i++) {
    cin >> u >> v;
    du[u]++, du[v]++;
    add(u, v);
    add(v, u);
  }
  int mx = *max_element(du + 1, du + n + 1);
  cout << mx << '\n';
  dfs(1, 0, 0);
  for (int i = 1; i <= mx; i++) {
    cout << ret[i].size();
    for (int& x : ret[i]) cout << ' ' << x + 1;
    cout << '\n';
  }
}
