#include <iostream>        //每对顶点之间的最短路径,弗洛伊德(Floyd)算法
using namespace std;                                
const int MaxWeight=100000;    
int Vertex,edge[1000][1000],distF[1000][1000],i,j;
void init()
{
    for(i=1;i<=Vertex;i++)        //结点坐标都是从1开始的
        for(j=1;j<=Vertex;j++)
        {
            if(i==j)
                edge[i][j]=0;
            else
                edge[i][j]=MaxWeight;
        }
}                                        
void floyd()
{
    int k,pathF[1000][1000];
    for(i=1;i<=Vertex;i++)
        for(j=1;j<=Vertex;j++)
        {
            distF[i][j]=edge[i][j];
            if(i!=j&&distF[i][j]<MaxWeight)
                pathF[i][j]=i;
            else 
                pathF[i][j]=-1;
        }
    for(k=1;k<=Vertex;k++)        //逐次增加中间顶点k
    {
        for(i=1;i<=Vertex;i++)
            for(j=1;j<=Vertex;j++)
                if(distF[i][k]+distF[k][j]<distF[i][j])
                {
                    distF[i][j]=distF[i][k]+distF[k][j];
                    pathF[i][j]=pathF[k][j];
                }
    }
    for(i=1;i<=Vertex;i++)
        for(j=1;j<=Vertex;j++)
            cout<<"从第   "<<i<<"   个顶点到第  "<<j<<"   个顶点的最短路径是:  "<<distF[i][j]<<endl;
    cout<<endl;
}
int main()
{
    init();
    floyd();
    return 0;
 
  
//floyd 的变形
//poj9 3660 Cow Contest
#include <iostream>        //floyd,给出一些点之间的限制条件,问有多少点的次序是固定的
using namespace std;                                
#define maxn 102
int n,m,edge[maxn][maxn],distF[maxn][maxn],i,j;                                        
void floyd()        //求出每对顶点之间的大小关系
{
    int k;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            distF[i][j]=edge[i][j];
    for(k=1;k<=n;k++)        
    {
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                if(distF[i][k]!=0&&distF[i][k]==distF[k][j])    //如果a>b且b>c,则有a>c;同样,若a<b且b<c,则a<c
                {
                    distF[i][j]=distF[i][k];
                }
    }
}
int main()
{
    int a,b;
    cin>>n>>m;
    memset(edge,0,sizeof(edge));    //表示任两点间的大小关系都不确定
    while(m--)
    {
        cin>>a>>b;
        edge[a][b]=1;        // 1 表示a>b, 2 表示a<b ,0 表示 a,b的大小不确定
        edge[b][a]=2;
    }
    floyd();
    int res=0;
    for(i=1;i<=n;i++)
    {
        int s=0;
        for(j=1;j<=n;j++)
            if(distF[i][j]>0)
                s++;
        if(s==n-1)        //说明该点与其他所有点的大小关系都已确定,所以该点的次序必是固定的
            res++;
    }
    cout<<res<<endl;
    return 0;
}