#include <bits/stdc++.h>
using namespace std;
map<pair<int, int>, int> edge_no;
int max_day = 0;
vector<int> build_schedule[200001];
void addEdge(vector<int> adj[], int u, int v) {
  adj[u].push_back(v);
  adj[v].push_back(u);
}
void DFSUtil(int u, vector<int> adj[], vector<bool> &visited, int day) {
  visited[u] = true;
  int build_day = 1;
  for (int i = 0; i < adj[u].size(); i++)
    if (visited[adj[u][i]] == false) {
      if (build_day != day) {
        max_day = max(max_day, build_day);
        build_schedule[build_day].push_back(edge_no[make_pair(u, adj[u][i])]);
        DFSUtil(adj[u][i], adj, visited, build_day++);
      } else {
        max_day = max(max_day, build_day + 1);
        build_schedule[build_day + 1].push_back(
            edge_no[make_pair(u, adj[u][i])]);
        DFSUtil(adj[u][i], adj, visited, ++build_day);
        build_day++;
      }
    }
}
void DFS(vector<int> adj[], int V) {
  vector<bool> visited(V, false);
  for (int u = 1; u < V; u++)
    if (visited[u] == false) DFSUtil(u, adj, visited, 0);
}
int main() {
  int n, a, b;
  scanf("%d", &n);
  vector<int> adj[n + 1];
  for (int i = 1; i < n; i++) {
    scanf("%d%d", &a, &b);
    addEdge(adj, a, b);
    edge_no.insert(pair<pair<int, int>, int>(make_pair(a, b), i));
    edge_no.insert(pair<pair<int, int>, int>(make_pair(b, a), i));
  }
  DFS(adj, n + 1);
  printf("%d\n", max_day);
  for (int i = 1; i <= max_day; i++) {
    printf("%d ", build_schedule[i].size());
    for (auto it = build_schedule[i].begin(); it != build_schedule[i].end();
         it++) {
      printf("%d ", *it);
    }
    printf("\n");
  }
  return 0;
}
