#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9 + 7;
template <typename Arg1>
void __f(const char* name, Arg1&& arg1) {
  cerr << name << " = " << arg1 << '\n';
}
template <typename Arg1, typename... Args>
void __f(const char* names, Arg1&& arg1, Args&&... args) {
  const char* comma = strchr(names + 1, ',');
  cerr.write(names, comma - names) << " = " << arg1 << " || ";
  __f(comma + 1, args...);
}
template <class Ch, class Tr, class Container>
basic_ostream<Ch, Tr>& operator<<(basic_ostream<Ch, Tr>& os,
                                  Container const& x) {
  os << "{ ";
  for (auto& y : x) os << y << " ; ";
  return os << "}";
}
template <class X, class Y>
ostream& operator<<(ostream& os, pair<X, Y> const& p) {
  return os << "[ " << p.first << ", " << p.second << "]";
}
long long power(long long x, long long y, long long p) {
  long long res = 1;
  x = x % p;
  while (y > 0) {
    if (y & 1) res = (res * x) % p;
    y = y >> 1;
    x = (x * x) % p;
  }
  return res;
}
const long long L = 2e5 + 5;
set<long long> ad[L];
long long deg[L];
long long vis[L];
map<pair<long long, long long>, long long> edge;
vector<long long> vals[L];
long long ans;
void dfs(long long ind, long long day) {
  vis[ind] = 1;
  day %= ans;
  for (long long v : ad[ind]) {
    if (!vis[v]) {
      vals[day].push_back(edge[{ind, v}]);
      dfs(v, day + 1);
      day = (day + 1) % ans;
    }
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  long long n, u, v;
  cin >> n;
  for (long long i = 0; i < n - 1; i++) {
    cin >> u >> v;
    ad[u].insert(v);
    ad[v].insert(u);
    edge[{u, v}] = i + 1;
    edge[{v, u}] = i + 1;
    deg[u]++;
    deg[v]++;
    ans = max(ans, deg[u]);
    ans = max(ans, deg[v]);
  }
  cout << ans << '\n';
  long long ind = 1;
  for (long long i = 1; i <= n; i++) {
    if (deg[i] == ans) {
      ind = i;
      break;
    }
  }
  dfs(ind, 0);
  for (long long i = 0; i < ans; i++) {
    cout << (long long)(vals[i].size()) << ' ';
    for (long long ind : vals[i]) cout << ind << ' ';
    cout << '\n';
  }
  return 0;
}
