#include <bits/stdc++.h>
using namespace std;
long long int max(long long int a, long long int b) {
  if (a > b)
    return a;
  else
    return b;
}
long long int min(long long int a, long long int b) {
  if (a < b)
    return a;
  else
    return b;
}
const int dx[4] = {-1, 1, 0, 0};
const int dy[4] = {0, 0, -1, 1};
int XX[] = {-1, -1, -1, 0, 0, 1, 1, 1};
int YY[] = {-1, 0, 1, -1, 1, -1, 0, 1};
vector<long long int> vec[200005];
vector<long long int> vec2[200005];
map<pair<long long int, long long int>, long long int> mpp, mpp2;
void dfs(long long int node, long long int par) {
  long long int x = mpp2[make_pair(node, par)];
  set<long long int> s;
  long long int z = vec[node].size();
  for (long long int i = 1; i <= z + 2; i++) {
    s.insert(i);
  }
  s.erase(x);
  for (auto itr : vec[node]) {
    if (itr == par) continue;
    auto itr2 = s.begin();
    long long int val = (*itr2);
    s.erase(val);
    mpp2[make_pair(node, itr)] = (val);
    mpp2[make_pair(itr, node)] = (val);
    long long int ind = mpp[make_pair(node, itr)];
    vec2[val].push_back(ind);
    dfs(itr, node);
  }
}
int main() {
  ios_base::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);
  long long int n, i, j, x, k, y, m, w, h, c, l, b, f, T, a, t, u, v;
  cin >> n;
  long long int maxi = 0;
  for (i = 0; i < n - 1; i++) {
    cin >> u >> v;
    vec[u].push_back(v);
    vec[v].push_back(u);
    long long int z = vec[u].size();
    if (z > maxi) maxi = z;
    mpp[make_pair(u, v)] = i + 1;
    mpp[make_pair(v, u)] = i + 1;
    z = vec[v].size();
    if (z > maxi) maxi = z;
  }
  cout << maxi << "\n";
  dfs(1, 0);
  for (i = 1; i <= maxi; i++) {
    cout << vec2[i].size() << " ";
    for (j = 0; j < vec2[i].size(); j++) {
      cout << vec2[i][j] << " ";
    }
    cout << "\n";
  }
}
