/*
TASK: POST
LANG: C
*/
#include<stdio.h>
#include<stdlib.h>

#define MAXN 2048
#define MAXM 65536
#define INF 1000000000

typedef struct edge { int r,next; } edge;

int num[MAXN],beg[MAXN],back[MAXN],comp[MAXN],br[MAXN],sort[MAXN],adj[MAXN][MAXN],d[MAXN],next[MAXN],id,n;
char u[MAXN];
edge e[MAXM<<1];

int cmp(const void *e1,const void *e2)
{
	return num[*(int*)e2]-num[*(int*)e1];
}

void postn(int v)
{
	int i;
	u[v]=1;
	for(i=back[v];i!=0;i=e[i].next)
	{
		if(!u[e[i].r]) postn(e[i].r);
	}
	num[v]=++id;
}

void dfs(int v)
{
	int i;
	comp[v]=id; br[id]++;
	for(i=beg[v];i!=0;i=e[i].next)
	{
		if(!comp[e[i].r]) dfs(e[i].r);
	}
}

int calc(int v)
{
	int res=0,tmp,i;
	next[v]=-1;
	for(i=1;i<=n;i++)
	{
		if(adj[v][i])
		{
			tmp=calc(i);
			if(tmp>res) { res=tmp; next[v]=i; }
		}
	}
	return res+br[v];
}

int main()
{
	int m,i,j,mem=1,l,r,res;
	scanf("%d%d",&n,&m);
	for(i=0;i<m;i++)
	{
		scanf("%d%d",&l,&r);
		e[mem].r=r; e[mem].next=beg[l]; beg[l]=mem++;
		e[mem].r=l; e[mem].next=back[r]; back[r]=mem++;
	}
	for(i=1;i<=n;i++) if(!u[i]) postn(i);
	for(i=1;i<=n;i++) sort[i]=i;
	qsort(sort+1,n,sizeof(sort[0]),cmp);
	id=0;
	for(i=1;i<=n;i++)
	{
		if(!comp[sort[i]])
		{
			id++;
			dfs(sort[i]);
		}
	}
	for(i=1;i<=n;i++)
	{
		for(j=beg[i];j!=0;j=e[j].next)
		{
			if(comp[i]!=comp[e[j].r]) adj[comp[i]][comp[e[j].r]]=1;
		}
	}
	n=id;
	res=calc(comp[1]);
	for(i=comp[1];i!=-1;i=next[i]) br[i]=0;
	res+=calc(comp[1]);
	printf("%d\n",res);
	return 0;
}
