#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 500 * 1000 + 10;
vector<int> adj[MAX_N], vec[MAX_N];
int n, m, cnt;
queue<int> q;
set<int> s;
void readInput() {
  int n, m;
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    int u, v;
    cin >> u >> v;
    u--, v--;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  for (int i = 0; i < n; i++) sort(adj[i].begin(), adj[i].end()), s.insert(i);
}
void solve() {
  while (!s.empty()) {
    q.push(*s.begin()), s.erase(s.begin());
    while (!q.empty()) {
      int u = q.front();
      q.pop(), vec[cnt].push_back(u);
      int cur = 0;
      vector<int> tmp;
      for (auto v : s) {
        while (cur < adj[u].size() && adj[u][cur] < v) cur++;
        if (cur == adj[u].size() || adj[u][cur] != v) tmp.push_back(v);
      }
      for (auto v : tmp) q.push(v), s.erase(v);
    }
    cnt++;
  }
}
void writeOutput() {
  cout << cnt << endl;
  for (int i = 0; i < cnt; i++) {
    cout << vec[i].size() << ' ';
    for (auto u : vec[i]) cout << u + 1 << ' ';
    cout << endl;
  }
}
int main() {
  ios_base ::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);
  readInput(), solve(), writeOutput();
  return 0;
}
