#include <bits/stdc++.h>
using namespace std;
const int inf = (int)1e9;
const double eps = (double)1e-8;
const int mod = (int)1000000007;
const int maxn = (int)2 * 1e5 + 5;
int n, x, y, mx;
int u[maxn], pr[maxn];
pair<int, int> t[maxn];
vector<pair<int, int> > a[maxn];
vector<int> ans;
list<int> q;
list<int>::iterator it1;
void dzen(int v, int p) {
  pr[v] = p;
  if (a[v].size() > 1 || v == 1) {
    q.push_back(v);
    u[v] = 0;
    if (a[v][0].first == p) u[v] = 1;
  }
  mx = max((int)a[v].size(), mx);
  for (int i = (0); i < (a[v].size()); i++) {
    if (a[v][i].first == p) continue;
    dzen(a[v][i].first, v);
  }
  return;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  ;
  cin >> n;
  for (int i = (2); i <= (n); i++) {
    cin >> x >> y;
    a[x].push_back(make_pair(y, i - 1));
    a[y].push_back(make_pair(x, i - 1));
  }
  mx = 0;
  dzen(1, 0);
  memset(t, -1, sizeof t);
  cout << mx << "\n";
  while (mx--) {
    ans.clear();
    for (list<int>::iterator it = q.begin(); it != q.end();) {
      if (t[pr[*it]].first == mx && t[pr[*it]].second == *it) {
        it++;
        continue;
      }
      t[*it] = make_pair(mx, a[*it][u[*it]].first);
      ans.push_back(a[*it][u[*it]].second);
      u[*it]++;
      if (u[*it] < (int)a[*it].size() && a[*it][u[*it]].first == pr[*it])
        u[*it]++;
      if (u[*it] == (int)a[*it].size()) {
        it1 = it;
        it++;
        q.erase(it1);
      } else
        it++;
    }
    cout << ans.size() << " ";
    for (int i = (0); i < (ans.size()); i++) {
      cout << ans[i] << " ";
    }
    cout << "\n";
  }
  return 0;
}
