#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
int map[1010][1010];
int vis[1010];
vector<int> g[1010];
int n,m;
//把源头带进去dfs,每经过一个节点x,就让他和源头pre建立边。
void dfs(int x,int pre)
{
vis[x]=1;
printf("%d\n",x);
map[x][pre]=1;
map[pre][x]=1;
for(int i=0; i<g[x].size(); ++i){
if(!vis[g[x][i]]){
dfs(g[x][i],pre);
}
}
}
int main(){
memset(g, 0, sizeof(g));
//输入边、节点信息
cin>>n>>m;
for(int i=1; i<=m; ++i){
int a,b;
cin>>a>>b;
g[a].push_back(b);
}
//搜索建图 图节点信息 变量 i,j 从1开始
for(int i=1; i<=n; ++i){
memset(vis, 0, sizeof(vis));
dfs(i,i);
}
//计数 图节点信息 变量 i,j 从1开始
int cnt=0;
for(int i=1; i<=n; ++i){
int j;
for(j=1; j<=n; ++j){
if(map[i][j]==0) break;
}
if(j==n+1) cnt++;
}
//输出
cout<<cnt<<endl;
return 0;
}