#include<bits/stdc++.h>
using namespace std;
vector<int> g[200010];
int idx,top,scc;
int id[200010],sz[200010];
int dfn[200010],low[200010],st[200010],instk[200010];
int d[200010],dis[200010];
struct node{
int v,w;
};
vector<node> e[200010],ep[200010];
void tarjan(int u){
dfn[u]=low[u]=++idx;
st[++top]=u,instk[u]=1;
for(auto v:g[u]){
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}else{
if(instk[v]) low[u]=min(low[u],dfn[v]);
}
}
if(dfn[u]==low[u]){
scc++;
int v;
do{
v=st[top],top--;
instk[v]=0;
id[v]=scc;
}while(v!=u);
}
}
bool vis[200010];
void SPFA(int s){
queue<int> q;
q.push(s);
vis[s]=1;
while(!q.empty()){
int u=q.front();
q.pop();
vis[u]=0;
for(auto v:e[u]){
if(d[v.v]<d[u]+v.w){
d[v.v]=d[u]+v.w;
if(!vis[v.v]) q.push(v.v);
}
}
}
}
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
g[u].push_back(v);
}
for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
int s=id[1];
for(int i=1;i<=n;i++){
sz[id[i]]++;
}
for(int i=1;i<=n;i++){
for(auto v:g[i]){
if(id[v]!=id[i]){
e[id[i]].push_back(node{id[v],sz[id[v]]});
}
}
}
SPFA(s);
for(int i=1;i<=scc;i++) dis[i]=d[i];
for(int i=1;i<=scc;i++){
for(auto v:e[i]){
ep[v.v].push_back(node{i,sz[id[i]]});
}
}
for(int i=1;i<=scc;i++) e[i].clear();
for(int i=1;i<=scc;i++){
for(auto v:ep[i]){
e[i].push_back(v);
}
}
memset(d,0,sizeof d);
SPFA(s);
int ans=0;
for(int i=1;i<=n;i++){
for(auto v:g[i]){
if(id[v]!=id[i]){
if(dis[id[v]]>0&&d[id[i]]>0) ans=max(ans,dis[id[v]]+d[id[i]]);
}
}
}
cout<<ans+sz[id[1]]<<endl;
return 0;
}