#include <bits/stdc++.h>
using namespace std;
const long long MODD = 1000000007LL;
long long poww(long long x, long long y, long long MODD) {
  if (x == 0LL && y == 0LL) {
    return 1LL;
  }
  long long ret = 1;
  while (y) {
    if (y & 1LL) {
      ret *= x;
      ret %= MODD;
    }
    x *= x;
    x %= MODD;
    y >>= 1;
  }
  return ret;
}
vector<long long> gra[200005];
long long n;
long long anse = 0;
long long deg[200005];
map<pair<long long, long long>, long long> M1;
map<pair<long long, long long>, long long> M2;
long long tillnow[200005];
long long par[200005];
long long vis[200005];
void bfs(long long node) {
  queue<long long> Q;
  vis[node] = 1;
  Q.push(node);
  while (!Q.empty()) {
    long long v = Q.front();
    Q.pop();
    vis[v] = 1;
    for (long long u : gra[v]) {
      if (vis[u]) continue;
      if (tillnow[v] + 1 == par[v]) tillnow[v]++;
      if (tillnow[v] + 1 != par[v]) {
        M1[pair<long long, long long>(u, v)] = tillnow[v] + 1;
        tillnow[v]++;
        par[u] = tillnow[v];
        vis[u] = 1;
        Q.push(u);
      }
    }
  }
}
vector<pair<long long, long long> > edge[200005];
int main() {
  cin >> n;
  for (long long i = 1; i <= n - 1; ++i) {
    long long a, b;
    cin >> a >> b;
    M2[pair<long long, long long>(a, b)] = i;
    M2[pair<long long, long long>(b, a)] = i;
    gra[a].push_back(b);
    gra[b].push_back(a);
    deg[a]++;
    deg[b]++;
    anse = max(anse, deg[a]);
    anse = max(anse, deg[b]);
  }
  bfs(1);
  auto it = M1.begin();
  while (it != M1.end()) {
    edge[it->second].push_back(it->first);
    it++;
  }
  cout << anse << "\n";
  for (long long i = 1; i <= anse; ++i) {
    cout << edge[i].size() << " ";
    for (pair<long long, long long> j : edge[i]) {
      cout << M2[j] << " ";
    }
    cout << "\n";
  }
  return 0;
}
