#include <bits/stdc++.h>
using namespace std;
int gcd1(int a, int b) {
  if (a == 0) return b;
  return gcd1(b % a, a);
}
long long modx(long long base, long long ex) {
  long long ans = 1LL, val = base;
  while (ex > 0LL) {
    if (ex & 1LL) ans = (ans * val) % 1000000007LL;
    val = (val * val) % 1000000007LL;
    ex = ex >> 1LL;
  }
  return ans;
}
const int maxn = 2e5 + 10;
vector<int> adj[maxn], v[maxn];
bool visit[maxn];
int n, x, y, parent[maxn], a[maxn], ans;
map<pair<int, int>, int> mp;
void dfs(int start, int par, int ind) {
  visit[start] = true;
  parent[start] = par, a[start] = ind;
  int cnt = 1;
  for (int i = 0; i < adj[start].size(); i++) {
    int pt = adj[start][i];
    if (!visit[pt]) {
      if (cnt == a[start]) {
        dfs(pt, start, ++cnt);
        cnt++;
      } else {
        dfs(pt, start, cnt);
        cnt++;
      }
    }
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n;
  for (int i = 1; i < n; i++) {
    cin >> x >> y;
    adj[x].push_back(y);
    adj[y].push_back(x);
    mp[make_pair(x, y)] = mp[make_pair(y, x)] = i;
    ans = max(ans, (int)adj[x].size());
    ans = max(ans, (int)adj[y].size());
  }
  dfs(1, 0, 0);
  for (int i = 2; i <= n; i++) {
    int par = parent[i];
    v[a[i]].push_back(mp[make_pair(i, par)]);
  }
  cout << ans << endl;
  for (int i = 1; i <= ans; i++) {
    cout << v[i].size() << " ";
    for (int j = 0; j < v[i].size(); j++) cout << v[i][j] << " ";
    cout << endl;
  }
  return 0;
}
