/*
TASK: POST
LANG: C
*/

#include<stdio.h>

int n,m,i,j;
int s[2][2048];
int v[2048][2048];
int next[2048];
int a,b;
int p,sum;
int max[2048];
int used[2048]={0};
int rused[2048]={0};
int sused[2048]={0};

int main () {
//    freopen("in.txt","rt",stdin);
//    freopen("post.txt","wt",stdout);
    scanf("%d %d",&n,&m);
    for (i=0;i<m;i++) {
        scanf("%d %d",&a,&b);
        v[a-1][b-1]=1;
        }
    s[0][1]=0;
    s[1][1]=0;
    p=1;
    while (p) {
          a=s[0][p];
          rused[a]=sused[a]=1;
          b=s[0][p-1];
          if (!next[a])
             next[a]=-1;
          i=s[1][p];
          for (;i<n;i++)
              if (v[a][i]&&!sused[i])
                 if (!rused[i]) {
                    s[1][p]=i+1;
                    s[0][p+1]=i;
                    s[1][++p]=0;
                    break;
                    }
                 else {
                      if (max[i]+1>max[a]) {
                         max[a]=max[i]+1;
                         next[a]=i;
                         }
                      }
          if (i==n) {
             p--;
             sused[a]=0;
             if (p)
             if (max[a]+1>max[b]) {
                            max[b]=max[a]+1;
                            next[b]=a;
                            }
             }
          }
    sum=max[0]+1;
    a=0;
    while (a!=-1) {
          used[a]=1;
          a=next[a];
          }
    for (i=0;i<n;i++)
        rused[i]=max[i]=0;
    s[0][1]=0;
    s[1][1]=0;
    p=1;
    while (p) {
          a=s[0][p];
          rused[a]=sused[a]=1;
          b=s[0][p-1];
          if (!next[a])
             next[a]=-1;
          i=s[1][p];
          for (;i<n;i++)
              if (v[a][i]&&!sused[i])
                 if (!rused[i]) {
                    s[1][p]=i+1;
                    s[0][p+1]=i;
                    s[1][++p]=0;
                    break;
                    }
                 else {
                      if (!used[i]) {
                         if (max[i]+1>max[a]) {
                            max[a]=max[i]+1;
                            next[a]=i;
                            }
                         }
                      else {
                           if (max[i]>max[a]) {
                              max[a]=max[i];
                              next[a]=i;
                              }
                           }
                      }
          if (i==n) {
             sused[a]=0;
             if (!used[a]) {
                if (max[a]+1>max[b]) {
                   max[b]=max[a]+1;
                   next[b]=a;
                   }
                }
             else {
                  if (max[a]>max[b]) {
                     max[b]=max[a];
                     next[b]=a;
                     }
                  }
             p--;
             }
          }
    sum+=max[0];
    printf("%d\n",sum);
    return 0;
    }
