#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stack>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp(vector<int> a, vector<int> b) {
return a[0] < b[0];
}
int n, m;
vector<vector<int>> arr;
vector<vector<int>> rarr;
vector<bool> vis;
stack<int> fst;
void dfs(int x) {
vis[x] = true;
for (auto v : arr[x]) {
if (vis[v]) continue;
dfs(v);
}
fst.push(x);
}
vector<int> find_scc(int x, vector<int> scc) {
vis[x] = true;
scc.push_back(x);
for (auto v : rarr[x]) {
if (vis[v]) continue;
scc = find_scc(v, scc);
}
return scc;
}
int main()
{
cin >> n >> m;
arr.resize(n + 1); rarr.resize(n + 1);
for (int i = 1; i <= m; i++) {
int s, d;
cin >> s >> d;
arr[s].push_back(d);
rarr[d].push_back(s);
}
vis = vector<bool>(n + 1, false);
for (int i = 1; i <= n; i++) {
if (vis[i]) continue;
dfs(i);
}
vis = vector<bool>(n + 1, false);
vector<vector<int>> scc;
while (!fst.empty()) {
auto cur = fst.top(); fst.pop();
if (vis[cur]) continue;
auto ret = find_scc(cur, vector<int>());
sort(ret.begin(), ret.end());
scc.push_back(ret);
}
sort(scc.begin(), scc.end(), cmp);
cout << scc.size() << "\n";
for (int i = 0; i < scc.size(); i++) {
for (int j = 0; j < scc[i].size(); j++) {
cout << scc[i][j] << " ";
}
cout << "-1\n";
}
return 0;
}