#include <bits/stdc++.h>
using namespace std;
vector<int> neigh[200005];
int ptr[200005];
vector<int> children[200005];
int order[200005];
int par[200005];
int get(int v) {
  if (par[v] == v) return v;
  return par[v] = get(par[v]);
}
void del(int v) { par[get(v)] = par[get(v + 1)]; }
int N;
void init() {
  vector<bool> visited(200005, false);
  vector<int> from(200005, 0);
  queue<int> Q;
  int T = 0;
  visited[1] = true;
  Q.push(1);
  order[T++] = 1;
  while (!Q.empty()) {
    int v = Q.front();
    Q.pop();
    for (int i = 0; i < neigh[v].size(); i++) {
      int u = neigh[v][i];
      if (visited[u]) continue;
      from[u] = v;
      visited[u] = true;
      Q.push(u);
      order[T++] = u;
    }
  }
  for (int v = 1; v <= N; v++) {
    for (int i = 0; i < neigh[v].size(); i++) {
      if (neigh[v][i] != from[v]) {
        children[v].push_back(neigh[v][i]);
      }
    }
  }
  for (int i = 0; i <= N + 1; i++) {
    par[i] = i;
  }
}
map<pair<int, int>, int> M;
int main() {
  ios::sync_with_stdio(false);
  cin >> N;
  for (int i = 1; i <= N - 1; i++) {
    int u, v;
    cin >> u >> v;
    neigh[u].push_back(v);
    neigh[v].push_back(u);
    M.insert(make_pair(make_pair(u, v), i));
    M.insert(make_pair(make_pair(v, u), i));
  }
  init();
  vector<vector<int> > ans;
  vector<int> lastTime(200005, 0);
  int time = 1;
  while (true) {
    vector<int> cur;
    for (int i = get(0); i < N; i = get(i + 1)) {
      int v = order[i];
      if (ptr[v] == children[v].size()) {
        del(i);
      } else if (lastTime[v] != time) {
        cur.push_back(M[make_pair(v, children[v][ptr[v]])]);
        lastTime[children[v][ptr[v]]] = time;
        ptr[v]++;
      }
    }
    if (cur.empty()) break;
    ans.push_back(cur);
    time++;
  }
  cout << ans.size() << endl;
  for (int i = 0; i < ans.size(); i++) {
    cout << ans[i].size() << " ";
    for (int j = 0; j < ans[i].size(); j++) {
      cout << ans[i][j] << " ";
    }
    cout << endl;
  }
}
