

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using PII = pair<int,int>;
using EDGE = tuple<int,int,ll>;
const int N = 2e4 + 10;
const ll INF = 1e9 + 7;
//存图
int n,m;
vector<int>G[N];//tarjan
int dfn[N],low[N];
int timer;
stack<int>S;
bool instack[N];//染色,建立新图
int col[N];
int scc_cnt;
int in[N];
int pts[N];//每个大点节点数void tarjan(int cur)
{dfn[cur] = low[cur] = ++timer;S.push(cur);instack[cur] = true;for(int nxt:G[cur]){if(dfn[nxt] == 0){tarjan(nxt);low[cur] = min(low[cur],low[nxt]);}else if(instack[nxt])low[cur] = min(low[cur],dfn[nxt]);}if(dfn[cur] == low[cur]){scc_cnt ++;while(true){int topval = S.top();S.pop();instack[topval] = false;col[topval] = scc_cnt;if(topval == cur)break;}}
}void happy_every_day()
{cin >> n >> m;for(int i = 1;i <= m;i ++){int u,v;cin >> u >> v;G[v].push_back(u);//[USACO03FALL / HAOI2006] 受欢迎的牛G 记录反图}//tarjan找SCCfor(int i = 1;i <= n; i++)if(dfn[i] == 0)tarjan(i);//记录缩点后每个点的小点个数//SCC缩点set<PII>edges;for(int i = 1;i <= n;i ++){pts[col[i]] ++;for(int j:G[i]){if(col[i] == col[j])continue;edges.insert({col[i],col[j]});}}for(auto [u,v]:edges)in[v] ++;//找一个入度为0的大点int res = 0;for(int i = 1;i <= scc_cnt;i ++){if(in[i] == 0){if(res != 0){cout << 0 << endl;return;}else res = pts[i];}}cout << res << endl;
}int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int t;t = 1;while(t --){happy_every_day();}return 0;
}