#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;
}