#include <bits/stdc++.h>
using namespace std;
const int MAX = 2000005;
int n, x, y, mxday;
map<pair<int, int>, int> mp2;
vector<vector<int> > adj(MAX);
vector<pair<int, int> > edge;
void dfs(int node, int parent, int pDay) {
  int cnt = 1;
  for (int i(0); i < int(adj[node].size()); i++) {
    int ch = adj[node][i];
    if (ch == parent) continue;
    if (cnt == pDay) cnt++;
    if (node > ch)
      mp2[{ch, node}] = cnt;
    else
      mp2[{node, ch}] = cnt;
    mxday = max(mxday, cnt);
    cnt++;
  }
  for (int i(0); i < int(adj[node].size()); i++)
    if (adj[node][i] != parent) {
      if (node > adj[node][i])
        dfs(adj[node][i], node, mp2[{adj[node][i], node}]);
      else
        dfs(adj[node][i], node, mp2[{node, adj[node][i]}]);
    }
}
int main() {
  edge.push_back({0, 0});
  scanf("%d", &n);
  for (int i(1); i < n; i++) {
    scanf("%d", &x), scanf("%d", &y);
    adj[x].push_back(y), adj[y].push_back(x);
    edge.push_back({x, y});
  }
  dfs(1, 0, 0);
  vector<vector<int> > ans(mxday + 1);
  for (int i(1); i < n; i++) {
    x = edge[i].first, y = edge[i].second;
    if (x > y) swap(x, y);
    ans[mp2[{x, y}]].push_back(i);
  }
  printf("%d\n", mxday);
  for (int i(1); i < mxday + 1; i++) {
    if (int(ans[i].size())) printf("%d ", int(ans[i].size()));
    for (int j(0); j < int(ans[i].size()); j++) printf("%d ", ans[i][j]);
    puts("");
  }
}
