#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5;
int n;
vector<pair<int, int> > edge[MAXN + 5];
int ind[MAXN + 5];
vector<int> ans[MAXN + 5];
inline void OPEN(string s) {
  freopen((s + ".in").c_str(), "r", stdin);
  freopen((s + ".out").c_str(), "w", stdout);
}
void dfs(int u, int fa, int No) {
  int now = 0;
  for (int i = 0; i < edge[u].size(); i++) {
    pair<int, int> v = edge[u][i];
    if (v.first == fa) continue;
    now + 1 == No ? now += 2 : now += 1;
    ans[now].push_back(v.second);
    dfs(v.first, u, now);
  }
}
void Solve(int start) {
  int now = 0;
  for (int i = 0; i < edge[start].size(); i++) {
    pair<int, int> v = edge[start][i];
    now++;
    ans[now].push_back(v.second);
    dfs(v.first, start, now);
  }
}
void Print(int start) {
  printf("%d\n", ind[start]);
  for (int i = 1; i <= ind[start]; i++) {
    printf("%d ", ans[i].size());
    for (int j = 0; j < ans[i].size(); j++) printf("%d ", ans[i][j]);
    printf("\n");
  }
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i < n; i++) {
    int u, v;
    scanf("%d %d", &u, &v);
    edge[u].push_back(make_pair(v, i));
    edge[v].push_back(make_pair(u, i));
    ind[u]++, ind[v]++;
  }
  int start = 1;
  for (int i = 1; i <= n; i++)
    if (ind[i] > ind[start]) start = i;
  Solve(start);
  Print(start);
  return 0;
}
