#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#include<stack>
using namespace std;
int v,e;
bool maked[30];
stack<int> st;
int id[30];
int ans;
vector<int> * Reverse(vector<int> * vec)
{
vector<int> *arr=new vector<int> [30];
for(int i=0;i<v;i++)
{
for(int j:vec[i])
{
arr[j].push_back(i);
}
}
return arr;
}
void DFS_st(vector<int> *arr,int i)
{
maked[i]=true;
for(auto j:arr[i])
if(!maked[j])
DFS_st(arr,j);
st.push(i);
}
void DFS(vector<int> * vec,int i)
{
maked[i]=true;
id[i]=ans;
for(auto j:vec[i])
if(!maked[j])
DFS(vec,j);
}
int main()
{
vector<int> * vec;
vector<int> * arr;
arr=new vector<int> [30];
vec= new vector<int> [30];
cin>>v>>e;
for(int i=0;i<e;i++)
{
int a,b;
cin>>a>>b;
vec[a].push_back(b);
}
arr=Reverse(vec);
for(int i=0;i<v;i++)
if(!maked[i])
DFS_st(arr,i);
memset(maked,false,sizeof(maked));
while(!st.empty())
{
int i=st.top();
if(!maked[i])
{
DFS(vec,i);
ans++;
}
st.pop();
}
for(int i=0;i<ans;i++)
{
for(int j=0;j<v;j++)
{
if(id[j]==i)
cout<<j<<" ";
}
cout<<endl;
}
}