/// 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;
}
