#include <bits/stdc++.h>
using namespace std;
long long int node, edge, vis[100010], dist[100010], col[110000], in[110000],
    out[110000], timer = 1;
vector<long long int> gh[200010], ind[200010], ans[200010];
void dfs(long long int node, long long int p, long long int blocked) {
  long long int cnt = 0;
  for (long long int i = 0; i < gh[node].size(); i++) {
    long long int child = gh[node][i];
    long long int idx = ind[node][i];
    if (child == p)
      continue;
    else {
      cnt++;
      if (cnt == blocked) cnt++;
      ans[cnt].push_back(idx);
      dfs(child, node, cnt);
    }
  }
}
int main() {
  ios ::sync_with_stdio(false);
  cin.tie(0);
  ;
  vector<long long int> u, v, uu, vv;
  map<long long int, long long int> mp, mq;
  vector<pair<long long int, long long int> > vp;
  set<long long int> sett;
  map<long long int, long long int>::iterator it;
  long long int x, y, z, c, d, e, f, g, h, j, k, l, n, m, o, p, q = 0, r, t,
                                                                ck = 0, sum = 0;
  string s, s1, s2, tt;
  cin >> node;
  edge = node - 1;
  for (long long int k = 1; k < edge + 1; k++) {
    cin >> x >> y;
    gh[x].push_back(y);
    gh[y].push_back(x);
    ind[x].push_back(k);
    ind[y].push_back(k);
  }
  long long int root = 1;
  for (long long int j = 2; j < node + 1; j++) {
    if (gh[j].size() > gh[root].size()) root = j;
  }
  dfs(root, root, 0);
  cout << gh[root].size() << "\n";
  for (k = 1; k <= gh[root].size(); k++) {
    cout << ans[k].size() << " ";
    for (j = 0; j < ans[k].size(); j++) {
      cout << ans[k][j] << " ";
    }
    cout << "\n";
  }
  return 0;
}
