#include <iostream>
#include <cstring>
using namespace std;
#define umap unordered_map
#define uset unordered_set
#define ll long long
#define ld long double
#define pii pair<int,int>
#define pll pair<long long,long long>
const ll INF=9223372036854775807;
namespace mySTL{
inline int max(int a,int b){return a>b?a:b;}
inline int min(int a,int b){return a<b?a:b;}
inline ll max(ll a,ll b){return a>b?a:b;}
inline ll min(ll a,ll b){return a<b?a:b;}
inline ld min(ld a,ld b){return a<b?a:b;}
inline ld max(ld a,ld b){return a>b?a:b;}
inline int _abs(int a){return a<0?-a:a;}
inline int read(){char c=getchar();int f=1,ans=0;
while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9')ans*=10,ans+=c-'0',c=getchar();
return ans*f;}
inline long long readll(){char c=getchar();long long f=1,ans=0;
while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9')ans*=10,ans+=c-'0',c=getchar();
return ans*f;}
inline void swap(int &a,int &b){a^=b,b^=a,a^=b;}
inline void swap(ll &a,ll &b){a^=b,b^=a,a^=b;}
inline void write(int x){if(x<0){putchar('-');x=-x;}
if(x>=10){write(x/10);}putchar(x%10+'0');}
inline void writell(long long x){if(x<0){putchar('-');x=-x;}
if(x>=10){writell(x/10);}putchar(x%10+'0');}
inline ll pw(ll a,ll b,ll p){if(b==0)return 1;
if(b==1)return a%p;
ll mid=pw(a,b/2,p)%p;
if(b&1)return mid*mid%p*a%p;else{return mid*mid%p;}}
inline int gcd(int a,int b){return b?gcd(b,a%b):a;}
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline int lcm(int a,int b){return a*b/gcd(a,b);}
}
using namespace mySTL;
struct edge{
int u;
int nxt;
}a[500500];
int n,m,u,v,last[100010],tot,id,dfn[100010],low[100010],cnt,out[10010];
int t,stk[500010],hd,belong[100010],ans;
bool instk[100010];
inline void add(int u,int v){
a[++tot].u=v;
a[tot].nxt=last[u];
last[u]=tot;
}
inline void Tarjan(int x){
dfn[x]=++id;
low[x]=id;
stk[++hd]=x;
instk[x]=true;
for(int i=last[x];i!=-1;i=a[i].nxt){
int v=a[i].u;
if(!dfn[v]){
Tarjan(v);
low[x]=min(low[x],low[v]);
}else if(instk[v]){
low[x]=min(low[x],low[v]);
}
}
if(dfn[x]==low[x]){
cnt++;
while(stk[hd+1]!=x){
instk[stk[hd]]=false;
belong[stk[hd]]=cnt;
hd--;
}
}
}
int main(void){
memset(last,-1,sizeof(last));
n=read();
m=read();
while(m--){
u=read();
v=read();
add(u,v);
}
for(int i=1;i<=n;i++){
if(!dfn[i]){
Tarjan(i);
}
}
for(int i=1;i<=n;i++){
for(int j=last[i];j!=-1;j=a[j].nxt){
int v=a[j].u;
if(belong[i]!=belong[v]){
out[belong[v]]++;
}
}
}
for(int i=1;i<=cnt;i++){
if(!out[i]){
ans++;
}
}
write(ans);
return 0;
}