#include <bits/stdc++.h>
using namespace std;
vector<int> vn[100002], vt[100002];
bool viz[100002];
stack<int> parcurgere;
void dfs (int v) {
viz[v] = true;
for (auto vec : vn[v]) {
if (!viz[vec]) {
dfs(vec);
}
}
parcurgere.push(v);
}
void dfst (int v) {
viz[v] = true;
for (auto vec : vt[v]) {
if (!viz[vec]) {
dfst(vec);
}
}
}
int main () {
int n, m;
cin >> n >> m;
for (int i = 0; i < m; ++i) {
int a, b;
cin >> a >> b;
vn[a].push_back(b);
vt[b].push_back(a);
}
for (int i = 1; i <= n; ++i) {
if (!viz[i]) {
dfs(i);
}
}
fill(viz, viz + n + 1, false);
int C = 0;
while (!parcurgere.empty()) {
int nod = parcurgere.top();
parcurgere.pop();
if (!viz[nod]) {
dfst(nod);
C++;
}
}
cout << C;
}