#include <bits/stdc++.h>
using namespace std;
void bfs(vector<vector<uint64_t>>& g,
         map<tuple<uint64_t, uint64_t>, uint64_t>& i2r) {
  vector<bool> visit(g.size());
  deque<tuple<uint64_t, uint64_t, uint64_t>> ev;
  unordered_map<int64_t, vector<uint64_t>> roads_by_day;
  visit[1] = true;
  int day = 0;
  for (auto e : g[1]) {
    day += 1;
    ev.push_back({1, e, day});
    roads_by_day[day].push_back(i2r[{1, e}]);
  }
  while (!ev.empty()) {
    auto crt = ev.front();
    uint64_t nv = get<1>(crt);
    ev.pop_front();
    if (!visit[nv]) {
      visit[nv] = true;
      int day = 0;
      int noDay = get<2>(crt);
      for (auto e : g[nv]) {
        if (!visit[e]) {
          day += 1;
          if (day == noDay) {
            day += 1;
          }
          ev.push_back({nv, e, day});
          roads_by_day[day].push_back(i2r[{min(nv, e), max(nv, e)}]);
        }
      }
    }
  }
  cout << roads_by_day.size() << endl;
  for (auto kv : roads_by_day) {
    cout << kv.second.size() << " ";
    for (auto ed : kv.second) {
      cout << ed << " ";
    }
    cout << endl;
  }
}
int main() {
  ios::sync_with_stdio(false);
  uint64_t n;
  cin >> n;
  vector<vector<uint64_t>> v(n + 1);
  map<tuple<uint64_t, uint64_t>, uint64_t> i2r;
  for (uint64_t i = 0; i < n - 1; i++) {
    uint64_t x;
    cin >> x;
    uint64_t y;
    cin >> y;
    v[x].push_back(y);
    v[y].push_back(x);
    i2r[{min(x, y), max(x, y)}] = i + 1;
  }
  bfs(v, i2r);
  return 0;
}
