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