#include <iostream>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
vector<bool> vis, iscc;
vector<int> poslist;
vector<vector<int>> arr;
stack<int> st;
vector<vector<int>> scclist;
int cnt = 1;
bool cmp(vector<int> a, vector<int> b) {
return a[0] < b[0];
}
int dfs(int x) {
vis[x] = true;
poslist[x] = cnt++;
st.push(x);
int mp = poslist[x];
for (auto v : arr[x]) {
if (!vis[v]) {
int ret = dfs(v);
mp = ret < mp ? ret : mp;
}
else if (!iscc[v]) {
mp = mp < poslist[v] ? mp : poslist[v];
}
}
if (poslist[x] == mp) { //์ญ๋ฐฉํฅ ๊ฐ์ ์ด ์๋ ๊ฒฝ์ฐ ( ํ์ ๋ฒํธ ์ค ์๊ธฐ ์์ ์ด ๊ฐ์ฅ ์๋ค๋ ๊ฒ์ ์ญ๋ฐฉํฅ ๊ฐ์ ์ด ์๋ค๋ ์๋ฏธ )
scclist.push_back({});
while (!st.empty() && st.top() != x) {
scclist[scclist.size() - 1].push_back(st.top());
iscc[st.top()] = true;
st.pop();
}
scclist[scclist.size() - 1].push_back(st.top());
iscc[st.top()] = true;
st.pop();
sort(scclist[scclist.size() - 1].begin(), scclist[scclist.size() - 1].end());
}
return poslist[x] = mp;
}
int main()
{
int n, m; cin >> n >> m;
vis = vector<bool>(n + 1, false);
iscc = vector<bool>(n + 1, false);
poslist = vector<int>(n + 1);
arr = vector<vector<int>>(n + 1);
for (int i = 1; i <= m; i++) {
int s, e; cin >> s >> e;
arr[s].push_back(e);
}
for (int i = 1; i <= n; i++) {
if (vis[i]) continue;
dfs(i);
}
sort(scclist.begin(), scclist.end(), cmp);
cout << scclist.size() << "\n";
for (int i = 0; i < scclist.size(); i++) {
for (int j = 0; j < scclist[i].size(); j++) {
cout << scclist[i][j] << " ";
}
cout << "-1\n";
}
return 0;
}