#include <bits/stdc++.h>
using namespace std;
const int MAXN = 5 * 100 * 1000 + 14;
vector<int> comp[MAXN], adj[MAXN];
set<int> res;
int ans = 0;
void dfs(int v) {
  comp[ans].push_back(v);
  auto it = res.begin();
  while (it != res.end()) {
    if (find(adj[v].begin(), adj[v].end(), *it) == adj[v].end()) {
      int u = *it;
      res.erase(u);
      dfs(u);
      it = res.upper_bound(u);
    } else
      it++;
  }
  return;
}
int main() {
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  int n, m;
  cin >> n >> m;
  while (m--) {
    int u, v;
    cin >> u >> v;
    adj[v].push_back(u);
    adj[u].push_back(v);
  }
  for (int i = 1; i <= n; i++) {
    res.insert(i);
    sort(adj[i].begin(), adj[i].end());
  }
  while (!res.empty()) {
    int v = *res.begin();
    res.erase(v);
    ans++;
    dfs(v);
  }
  cout << ans << '\n';
  for (int i = 1; i <= ans; i++) {
    cout << comp[i].size() << ' ';
    for (auto u : comp[i]) cout << u << ' ';
    cout << '\n';
  }
  return 0;
}
