#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
int n,m;
struct edge{
int to,nxt;
}mp[100005];
int tot;
int head[100005];
int low[100005],dfn[100005];
int stac[100005],vis[100005];
int top,id,cnt;
void add(int u,int v){
mp[++tot].to = v;
mp[tot].nxt = head[u];
head[u] = tot;
return ;
}
void tarjan(int x,int fa){
low[x] = dfn[x] = ++id;
stac[++top] = x;
for(int i = head[x];i;i = mp[i].nxt){
int y = mp[i].to;
if(!dfn[y]){
tarjan(y,x);
low[x] = min(low[x],low[y]);
if(low[x] == dfn[x]){
int t = 0,cou = 0;
while(t != x){
if(top <= 0) break;
t = stac[top--];
cou++;
}
if(top) top--;
if(cou > 1) cnt++;
}
}
else low[x] = min(low[x],dfn[y]);
}
return ;
}
int main(){
scanf("%d%d",&n,&m);
for(int i = 1;i <= m;i++){
int u,v;
scanf("%d%d",&u,&v);
if(u == v) continue;
add(u,v);
}
for(int i = 1;i <= n;i++){
if(!dfn[i]){
if(head[i] == 0) continue;
tarjan(i,0);
}
}
if(cnt) printf("%d",cnt);
else printf("1");
return 0;
}