#include <bits/stdc++.h>
using namespace std;
int n;
vector<vector<int>> v;
vector<vector<int>> vt;
vector<int> checked;
vector<pair<int,int>> finals;
stack<int> sk;
bool cmp(pair<int,int> a,pair<int,int> b){
return a.first > b.first;
}
void dfs_n(int nod){
for(int i=0;i<v[nod].size();i++){
int newnod = v[nod][i];
if(checked[newnod] == 0){
checked[newnod] = 1;
dfs_n(newnod);
}
}
sk.push(nod);
}
void dfs_tr(int nod,int cnt){
finals[nod] = {cnt,nod};
for(int i=0;i<vt[nod].size();i++){
int newnod = vt[nod][i];
if(checked[newnod] == 1){
checked[newnod] = 2;
dfs_tr(newnod,cnt);
}
}
}
int main(){
ifstream cin("ctc.in");
ofstream cout("ctc.out");
int m;
cin>>n>>m;
v.resize(n+1);
finals.resize(n+1);
vt.resize(n+1);
checked.resize(n+1,0);
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
v[x].push_back(y);
vt[y].push_back(x);
}
for(int i=1;i<=n;i++){
if(checked[i]==0){
checked[i]=1;
dfs_n(i);
}
}
int total=0;
while(sk.size()){
int nod = sk.top();
sk.pop();
if(checked[nod]==1){
checked[nod] = 2;
total++;
dfs_tr(nod,total);
}
}
cout<<total<<"\n";
sort(finals.begin()+1,finals.end(),cmp);
for(int i=1;i<=n;i++){
if(finals[i].first!=finals[i-1].first and i>1)
cout<<"\n";
cout<<finals[i].second<<" ";
}
}