#include<bits/stdc++.h>
using namespace std;
const int maxN=10010;
struct node{
int to,val;
};
priority_queue<node> q;
vector<int> v[maxN],v2[maxN];
stack<int> s;
int timestp,m,cnt,ans,dfn[maxN],low[maxN],bl_scc[maxN],c_scc[maxN];
bool book[maxN];
bool operator<(node n1,node n2){
return n1.val<n2.val;
}
void dfs(int x){
dfn[x]=++timestp,low[x]=dfn[x];
s.push(x),book[x]=1;
for(int y:v[x]){
if(!dfn[y]){
dfs(y);
low[x]=min(low[x],low[y]);
} else if(book[y]) low[x]=min(low[x],low[y]);
}
if(low[x]==dfn[x]){
cnt++;
do{
m=s.top();
s.pop();
bl_scc[m]=cnt;
c_scc[cnt]++;
book[m]=0;
}while(x!=m);
}
}
int main(){
int n,x,y;
scanf("%d%d",&n,&m);
while(m--){
scanf("%d%d",&x,&y);
v[x].push_back(y);
}
for(int i=1;i<=n;i++) if(!dfn[i]) dfs(i);
for(int i=1;i<=n;i++){
for(int j:v[i]){
if(bl_scc[i]!=bl_scc[j]){
v2[bl_scc[i]].push_back(bl_scc[j]);
v2[bl_scc[i]+cnt].push_back(bl_scc[j]+cnt);
v2[bl_scc[j]].push_back(bl_scc[i]+cnt);
}
}
}
q.push(node{bl_scc[1],0}),m=c_scc[bl_scc[1]];
while(!q.empty()){
node t=q.top();
q.pop();
if(book[t.to]) continue;
book[t.to]=1;
if(t.to==bl_scc[1]+cnt) m=max(m,t.val);
for(auto y:v2[t.to]) q.push(node{y,t.val+c_scc[bl_scc[y]]});
}
printf("%d",m);
return 0;
}