// tarjan by muoii
// vn.spoj.com/problems/TJALG/
#include <bits/stdc++.h>
using namespace std;
#define tag "main"
#define maxn 100007
#define forinc(i,a,b) for(int i=a;i<=b;i++)
#define fordec(i,a,b) for(int i=a;i>=b;i--)
#define checkfile(FiLeNaMe) { if(fopen(FiLeNaMe".inp","r")) freopen(FiLeNaMe".inp","r",stdin),freopen(FiLeNaMe".out","w",stdout); }
/// --------------------------------------------------------------------------------------------------------------------------------
#define long long long
int n,m;
vector<int> adj[maxn];
// Strong connected components
int scc;
bool dd[maxn];
int num[maxn],low[maxn];
bool deleted[maxn];
stack<int> Stack;
int dfsTime;
void dfs(int u) {
if(dd[u]) return;
dd[u]=1;
num[u]=low[u]=++dfsTime;
Stack.push(u);
for(int v : adj[u]) {
if(deleted[v]) continue;
if(dd[v]) low[u]=min(low[u],num[v]);
else dfs(v),low[u]=min(low[u],low[v]);
}
if(low[u]==num[u]) {
++scc;
for(int v = Stack.top();v!=u;v=Stack.top()) Stack.pop(),deleted[v]=1;
deleted[u]=1;
Stack.pop();
}
}
void enter(){
cin>>n>>m;
for(int i=1,u,v;i<=m;i++) {
cin>>u>>v;
adj[u].push_back(v);
}
}
void solve(){
forinc(i,1,n) dfs(i);
cout<<scc;
}
int32_t main()
{
checkfile(tag);
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
enter();
solve();
return 0;
}
Ly8gdGFyamFuIGJ5IG11b2lpCi8vIHZuLnNwb2ouY29tL3Byb2JsZW1zL1RKQUxHLwoKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgdGFnICJtYWluIgojZGVmaW5lIG1heG4gMTAwMDA3CiNkZWZpbmUgZm9yaW5jKGksYSxiKSBmb3IoaW50IGk9YTtpPD1iO2krKykKI2RlZmluZSBmb3JkZWMoaSxhLGIpIGZvcihpbnQgaT1hO2k+PWI7aS0tKQojZGVmaW5lIGNoZWNrZmlsZShGaUxlTmFNZSkgeyBpZihmb3BlbihGaUxlTmFNZSIuaW5wIiwiciIpKSBmcmVvcGVuKEZpTGVOYU1lIi5pbnAiLCJyIixzdGRpbiksZnJlb3BlbihGaUxlTmFNZSIub3V0IiwidyIsc3Rkb3V0KTsgfQovLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KI2RlZmluZSBsb25nIGxvbmcgbG9uZwppbnQgbixtOwp2ZWN0b3I8aW50PiBhZGpbbWF4bl07CgovLyBTdHJvbmcgY29ubmVjdGVkIGNvbXBvbmVudHMKaW50IHNjYzsKYm9vbCBkZFttYXhuXTsKaW50IG51bVttYXhuXSxsb3dbbWF4bl07CmJvb2wgZGVsZXRlZFttYXhuXTsKc3RhY2s8aW50PiBTdGFjazsKaW50IGRmc1RpbWU7Cgp2b2lkIGRmcyhpbnQgdSkgewogICAgaWYoZGRbdV0pIHJldHVybjsKCiAgICBkZFt1XT0xOwogICAgbnVtW3VdPWxvd1t1XT0rK2Rmc1RpbWU7CiAgICBTdGFjay5wdXNoKHUpOwoKICAgIGZvcihpbnQgdiA6IGFkalt1XSkgewogICAgICAgIGlmKGRlbGV0ZWRbdl0pIGNvbnRpbnVlOwoKICAgICAgICBpZihkZFt2XSkgbG93W3VdPW1pbihsb3dbdV0sbnVtW3ZdKTsKICAgICAgICBlbHNlIGRmcyh2KSxsb3dbdV09bWluKGxvd1t1XSxsb3dbdl0pOwogICAgfQoKICAgIGlmKGxvd1t1XT09bnVtW3VdKSB7CiAgICAgICAgKytzY2M7CiAgICAgICAgZm9yKGludCB2ID0gU3RhY2sudG9wKCk7diE9dTt2PVN0YWNrLnRvcCgpKSBTdGFjay5wb3AoKSxkZWxldGVkW3ZdPTE7CiAgICAgICAgZGVsZXRlZFt1XT0xOwoJCVN0YWNrLnBvcCgpOwogICAgfQp9Cgp2b2lkIGVudGVyKCl7CiAgICBjaW4+Pm4+Pm07CgogICAgZm9yKGludCBpPTEsdSx2O2k8PW07aSsrKSB7CiAgICAgICAgY2luPj51Pj52OwogICAgICAgIGFkalt1XS5wdXNoX2JhY2sodik7CiAgICB9Cn0KCnZvaWQgc29sdmUoKXsKICAgIGZvcmluYyhpLDEsbikgZGZzKGkpOwogICAgY291dDw8c2NjOwp9CgppbnQzMl90IG1haW4oKQp7CiAgICBjaGVja2ZpbGUodGFnKTsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7IGNpbi50aWUoMCk7IGNvdXQudGllKDApOwoKICAgIGVudGVyKCk7CiAgICBzb2x2ZSgpOwoKICAgIHJldHVybiAwOwp9