#include<bits/stdc++.h>
using namespace std;
int n,m;
struct edge{
int to,ne;
}e[100005];int h[100005],ecnt;
void ade(int u,int v){
e[++ecnt]={v,h[u]},h[u]=ecnt;
}
int dfn[100005],low[100005],t;
int ins[100005],pos[100005],cnt;
stack<int>s;
struct node{
vector<int>to;
vector<int>pt;
int num;
}scc[200005];
void tarjan(int u){
low[u]=dfn[u]=++t;
s.push(u);ins[u]=1;
for(int i=h[u];i;i=e[i].ne){
int to=e[i].to;
if(!dfn[to]){
tarjan(to);
low[u]=min(low[u],low[to]);
}
else if(ins[to]){
low[u]=min(low[u],dfn[to]);
}
}
if(low[u]==dfn[u]){
cnt++;
while(1){
int top=s.top();s.pop();
scc[cnt].pt.push_back(top);
ins[top]=0;pos[top]=cnt;
if(top==u) break;
}
}
}
int ans;
int flag[100005];
int f[200005];
int in[200005];
queue<int>q;
void topo(){
for(int i=1;i<=cnt;i++){
if(!in[i]) q.push(i);
}
while(!q.empty()){
int u=q.front();
if(u<=cnt) flag[u]=1;
q.pop();
for(int i=0;i<scc[u].to.size();i++){
int to=scc[u].to[i];
in[to]--;
if(in[to]==0) q.push(to);
if(to>cnt){
if(flag[to-cnt]==0){
f[to]=max(f[to],f[u]+scc[to].num);
}
else{
f[to]=f[u];
}
}
else{
f[to]=max(f[to],f[u]+scc[to].num);
}
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v;cin>>u>>v;
ade(u,v);
}
for(int i=1;i<=n;i++){
if(!dfn[i]) tarjan(i);
}
for(int i=1;i<=cnt;i++){
int num=scc[i].pt.size();
scc[i].num=scc[i+cnt].num=num;
f[i]=f[i+cnt]=scc[i].num;
}
for(int i=1;i<=n;i++){
for(int j=h[i];j;j=e[j].ne){
int to=e[j].to;
if(pos[i]==pos[to]) continue;
scc[pos[i]].to.push_back(pos[to]);
scc[pos[i]+cnt].to.push_back(pos[to]+cnt);
in[pos[to]]++;in[pos[to]+cnt]++;
}
}
for(int i=1;i<=cnt;i++){
for(int j=0;j<scc[i].to.size();j++){
int to=scc[i].to[j];
scc[to].to.push_back(i+cnt);
in[i+cnt]++;
}
}
topo();
int ans=max(f[pos[1]],f[pos[1]+cnt]);
cout<<ans<<endl;
}