/// Kosaraju by muoii
/// vn.spoj.com/problems/TJALG/
#include <bits/stdc++.h>
using namespace std;
#define tag "spoj"
#define maxn 0
#define module 0
#define oo 1000000007LL
///>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
int ans;
int n,m;
vector< vector<int> > adj;
vector< vector<int> > bak;
///tarjan data:
int numbering;
vector<bool> dd;
vector<int> num,pos;
void topo(const int &u)
{
if(dd[u]) return;
dd[u]=1;
for(const int &v: adj[u])
topo(v);
pos[num[u]=numbering]=u;
--numbering;
}
void trace(const int &u)
{
if(dd[u]) return;
dd[u]=1;
for(const int &v: bak[u]) trace(v);
}
int main()
{
#ifdef dmdd
freopen(tag".inp","r",stdin); freopen(tag".out","w",stdout);
#endif // dmdd
ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m;
///load graph:
adj.resize(n+1);bak.resize(n+1);dd.resize(n+1);num.resize(n+1);pos.resize(n+1);
int x,y;
while(m-->0) cin>>x>>y,adj[x].push_back(y),bak[y].push_back(x);
///update ans:
numbering=n;
fill(dd.begin(),dd.end(),0);
for(int i=1;i<=n;i++)
topo(i);
fill(dd.begin(),dd.end(),0);
for(int i=1,u=pos[i];i<=n;u=pos[++i])
ans+=!dd[u],trace(u);
cout<<ans;
return 0;
}
Ly8vIEtvc2FyYWp1IGJ5IG11b2lpCi8vLyB2bi5zcG9qLmNvbS9wcm9ibGVtcy9USkFMRy8KI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgdGFnICJzcG9qIgojZGVmaW5lIG1heG4gMAojZGVmaW5lIG1vZHVsZSAwCiNkZWZpbmUgb28gMTAwMDAwMDAwN0xMCi8vLz4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4KaW50IGFuczsKaW50IG4sbTsKdmVjdG9yPCB2ZWN0b3I8aW50PiA+IGFkajsKdmVjdG9yPCB2ZWN0b3I8aW50PiA+IGJhazsKLy8vdGFyamFuIGRhdGE6CmludCBudW1iZXJpbmc7CnZlY3Rvcjxib29sPiBkZDsKdmVjdG9yPGludD4gbnVtLHBvczsKCnZvaWQgdG9wbyhjb25zdCBpbnQgJnUpCnsKICAgIGlmKGRkW3VdKSByZXR1cm47CiAgICBkZFt1XT0xOwoKICAgIGZvcihjb25zdCBpbnQgJnY6IGFkalt1XSkKICAgICAgICB0b3BvKHYpOwoKICAgIHBvc1tudW1bdV09bnVtYmVyaW5nXT11OwogICAgLS1udW1iZXJpbmc7Cn0Kdm9pZCB0cmFjZShjb25zdCBpbnQgJnUpCnsKICAgIGlmKGRkW3VdKSByZXR1cm47CiAgICBkZFt1XT0xOwoKICAgIGZvcihjb25zdCBpbnQgJnY6IGJha1t1XSkgdHJhY2Uodik7Cn0KaW50IG1haW4oKQp7CiAgICAjaWZkZWYgZG1kZAogICAgZnJlb3Blbih0YWciLmlucCIsInIiLHN0ZGluKTsgZnJlb3Blbih0YWciLm91dCIsInciLHN0ZG91dCk7CiAgICAjZW5kaWYgLy8gZG1kZAogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTtjaW4udGllKDApO2NvdXQudGllKDApOwoKICAgIGNpbj4+bj4+bTsKCiAgICAvLy9sb2FkIGdyYXBoOgogICAgYWRqLnJlc2l6ZShuKzEpO2Jhay5yZXNpemUobisxKTtkZC5yZXNpemUobisxKTtudW0ucmVzaXplKG4rMSk7cG9zLnJlc2l6ZShuKzEpOwogICAgaW50IHgseTsKICAgIHdoaWxlKG0tLT4wKSBjaW4+Png+PnksYWRqW3hdLnB1c2hfYmFjayh5KSxiYWtbeV0ucHVzaF9iYWNrKHgpOwogICAgLy8vdXBkYXRlIGFuczoKICAgIG51bWJlcmluZz1uOwogICAgZmlsbChkZC5iZWdpbigpLGRkLmVuZCgpLDApOwogICAgZm9yKGludCBpPTE7aTw9bjtpKyspCiAgICAgICAgICAgIHRvcG8oaSk7CgogICAgZmlsbChkZC5iZWdpbigpLGRkLmVuZCgpLDApOwogICAgZm9yKGludCBpPTEsdT1wb3NbaV07aTw9bjt1PXBvc1srK2ldKQogICAgICAgIGFucys9IWRkW3VdLHRyYWNlKHUpOwoKICAgIGNvdXQ8PGFuczsKICAgIHJldHVybiAwOwp9Cg==