/*
TASK:post
LANG:C++
*/

#include <stdio.h>
#include <algorithm>
#include <queue>

using namespace std;

#define IN "post.in"
#define OUT "post.out"
#define MAXN 2048

#define PII pair<int,int>
#define mp make_pair
#define X first
#define Y second

int N,M;

vector<int> m[MAXN];
int tag[MAXN];
int prev[MAXN];
int used1[MAXN];
int used2[MAXN];
int used[MAXN];

int w[MAXN*128] = {};
int bestw[MAXN*128] = {};
int bestl;
int L = 1;
int ans = 0;

int dfs (int v,int p) {
    w[L++] = v;

    if (m[v].size() == 0) {
       if (ans < p+1) {
          for (int i=1; i<=L; i++) bestw[i] = w[i];
          ans = p+1;
          bestl = L;
       }
       return 0;
    }

    if (used[v] == 0) {L--;return 0;}

    used[v]--;
    int oldtag = tag[v];
    p += tag[v];
    tag[v] = 0;

    for (int j=0; j<m[v].size(); j++) {
        dfs(m[v][j],p);
    }
    tag[v] = oldtag;
    used[v]++;
    L--;
    return 0;
}

int read () {
    scanf("%d%d",&N,&M);
    for (int i=1; i<=N; i++) {
        tag[i] = 1;
    }
    for (int i=1; i<=M; i++) {
        int a,b;
        scanf("%d%d",&a,&b);
        m[a].push_back(b);
        used1[a] ++;
        used2[b] ++;
    }
    for (int i=1; i<=N; i++) {
        used[i] = min(used1[i],used2[i]);
    }
    
    return 0;
}

int main () {
//    freopen(IN,"r",stdin);
//    freopen(OUT,"w",stdout);


    used2[1] = MAXN;
    read();
    dfs(1,0);
    for (int i=1; i<bestl; i++) tag[w[i]] = 0;
    int rans = ans;
    ans = 0;
    dfs(1,0);
    printf("%d\n",rans+ans);
    return 0;
}

