#include <bits/stdc++.h>
using namespace std;
vector<int> gr[114514], rgr[114514];
vector<int> vs;
bool sumi[114514];
int cmp[114514], num[114514];
void dfs(int v) {
  sumi[v] = true;
  for (int i = 0; i < gr[v].size(); i++) {
    if (!sumi[gr[v][i]]) dfs(gr[v][i]);
  }
  vs.push_back(v);
}
void rdfs(int v, int k) {
  sumi[v] = true;
  cmp[v] = k;
  for (int i = 0; i < rgr[v].size(); i++) {
    if (!sumi[rgr[v][i]]) rdfs(rgr[v][i], k);
  }
}
int scc(int v) {
  memset(sumi, false, sizeof(sumi));
  vs.clear();
  for (int i = 0; i < v; i++) {
    if (!sumi[i]) dfs(i);
  }
  memset(sumi, false, sizeof(sumi));
  int k = 0;
  for (int i = vs.size() - 1; i >= 0; i--) {
    if (!sumi[vs[i]]) rdfs(vs[i], k++);
  }
  return k;
}
int dfs2(int v) {
  sumi[v] = true;
  int ret = (num[cmp[v]] == 1);
  for (int i = 0; i < gr[v].size(); i++) {
    if (!sumi[gr[v][i]]) ret &= dfs2(gr[v][i]);
  }
  for (int i = 0; i < rgr[v].size(); i++) {
    if (!sumi[rgr[v][i]]) ret &= dfs2(rgr[v][i]);
  }
  return ret;
}
int main() {
  int n, m, out, a, b;
  cin >> n >> m;
  out = n;
  for (int i = 0; i < m; i++) {
    cin >> a >> b;
    a--;
    b--;
    gr[a].push_back(b);
    rgr[b].push_back(a);
  }
  m = scc(n);
  memset(num, 0, sizeof(num));
  memset(sumi, false, sizeof(sumi));
  for (int i = 0; i < n; i++) num[cmp[i]]++;
  for (int i = 0; i < n; i++) {
    if (!sumi[i]) out -= dfs2(i);
  }
  cout << out << endl;
}
