/*
TASK: post
LANG: C++
*/
#include <stdio.h>
#include <string.h>
#include <queue>
#include <vector>
#include <algorithm>
#define MAXN 8004
using namespace std;

 int prev[MAXN];
 int e[MAXN];
 vector<int> a[MAXN];
 vector<int> b[MAXN];
 vector<int> pb[MAXN];
 vector<int> rev[MAXN];
 vector<int> pom;
 vector<int> cost[MAXN];
 int list[MAXN];
 int n,m,res,z;
 int d[MAXN];
 int marked[MAXN];
 int c[MAXN];
 priority_queue < pair<int,int> > q;

 int dfs (int i)
  {
   int j,pom;
   if (d[i]!=-1) return c[i];
   if (i==n) return d[i]=1;
   for (j=0;j<b[i].size();j++)
    {
     pom=dfs(b[i][j]);
     if (d[i]<pom+c[i])
      {
       d[i]=pom+c[i];
       prev[i]=b[i][j];
      }      
    }
   return d[i];
  }

 void deep (int i)
  {
   int j;
   marked[i]=1;
   for (j=0;j<b[i].size();j++)
    if (marked[b[i][j]]==0)
     deep(b[i][j]);
   list[++z]=i;
  }

 void comp (int i)
  {
   int j;
   marked[i]=m;
   for (j=0;j<rev[i].size();j++)
    if (marked[rev[i][j]]==0)
     comp(rev[i][j]);
  }  

 int main ()
  {
   int i,j,v,u,k;
   scanf("%d%d",&n,&m);
   for (i=1;i<=m;i++)
    {
     scanf("%d%d",&v,&u);
     b[v].push_back(u);
     rev[u].push_back(v);
    }
   n++;
   for (i=1;i<n;i++)
    {
     b[i].push_back(n);
     rev[n].push_back(i);
    }
// make dag
   z=0;
   for (i=1;i<=n;i++)
    if (marked[i]==0)
     deep(i);
   memset(marked,0,sizeof(marked));
   m=0;
   for (i=z;i>=1;i--)
    if (marked[list[i]]==0)
     {
      m++;
      comp(list[i]);
     }     
   for (i=1;i<=n;i++)
    {
     pb[i]=b[i];
     b[i].clear();
    }
   for (j=1;j<=n;j++)
    {
     for (i=0;i<pb[j].size();i++)
      if (marked[pb[j][i]]!=marked[j])
       b[marked[j]].push_back(marked[pb[j][i]]);
     c[marked[j]]++;
    }
   n=m;
   for (i=1;i<=n;i++)
    {
     sort(b[i].begin(),b[i].end());
     pom=b[i];
     b[i].clear();
     k=-1;
     for (j=0;j<pom.size();j++)
      if (pom[j]!=k)
       {
        b[i].push_back(pom[j]);
        k=pom[j];
       }       
    }
//
   memset(d,-1,sizeof(d));
   dfs(1);
   res=d[1];
   if (d[1]==0)
    {
     printf("0\n");
     return 0;
    }
   memset(marked,0,sizeof(marked));
   marked[n]=1;
   j=0;
   for (i=1;i!=0;i=prev[i])
    {
     marked[i]=1;
     e[i]=j;
     j=i;
    }
   for (i=1;i<=n;i++)
    {
     if (marked[i]==0)
      {
       a[i].push_back(n+i);
       cost[i].push_back(c[i]);
      }
       else
        {
         a[i].push_back(n+i);
         cost[i].push_back(0);
         a[n+i].push_back(i);
         cost[n+i].push_back(-c[i]);
         if (e[i]!=0)
          {
           a[i].push_back(n+e[i]);
           cost[i].push_back(0);
          }
        }       
      for (j=0;j<b[i].size();j++)
       {
        a[i+n].push_back(b[i][j]);
        cost[i+n].push_back(0);
       }       
    }
   memset(d,-1,sizeof(d));
   d[1]=0;
   q.push(make_pair(0,1));
   while (!q.empty())
    {
     i=q.top().second;
     j=q.top().first;
     q.pop();
     if (d[i]!=j) continue;
     for (j=0;j<a[i].size();j++)
      if (d[a[i][j]]<d[i]+cost[i][j])
       {
        d[a[i][j]]=d[i]+cost[i][j];
        q.push(make_pair(d[a[i][j]],a[i][j]));
       }
    }    
   printf("%d\n",res+d[n]-1);
   return 0;
  }
  
