#include <bits/stdc++.h>
using namespace std;
vector<int> g[213700];
vector<int> gT[213700];
vector<int> g2[213700];
bool vis1[213700];
int kol = 1;
int num[213700];
int revnum[213700];
void dfs1(int a) {
  vis1[a] = true;
  for (int i = 0; i < g[a].size(); i++) {
    if (!vis1[g[a][i]]) {
      dfs1(g[a][i]);
    }
  }
  num[a] = kol;
  revnum[kol] = a;
  kol++;
}
bool vis3[213700];
int spojna[213799];
int sizespoj[213700];
int tempspoj = 1;
void dfs3(int a) {
  vis3[a] = true;
  spojna[a] = tempspoj;
  sizespoj[tempspoj]++;
  for (int i = 0; i < g2[a].size(); i++) {
    if (!vis3[g2[a][i]]) {
      dfs3(g2[a][i]);
    }
  }
}
bool vis2[213730];
int gtemp = 1;
bool jestcykl[213799];
int grupa[213799];
void dfs2(int a) {
  vis2[a] = true;
  grupa[a] = gtemp;
  for (int i = 0; i < gT[a].size(); i++) {
    if (!vis2[gT[a][i]]) {
      jestcykl[spojna[a]] = true;
      dfs2(gT[a][i]);
    }
  }
}
int main() {
  int n, m;
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    int a, b;
    cin >> a >> b;
    g[a].push_back(b);
    gT[b].push_back(a);
    g2[b].push_back(a);
    g2[a].push_back(b);
  }
  for (int i = 1; i <= n; i++) {
    if (!vis1[i]) {
      dfs1(i);
    }
    if (!vis3[i]) {
      dfs3(i);
      tempspoj++;
    }
  }
  for (int i = n; i >= 1; i--) {
    if (!vis2[revnum[i]]) {
      dfs2(revnum[i]);
      gtemp++;
    }
  }
  int wynik = 0;
  for (int i = 1; i <= n; i++) {
    if (sizespoj[i] != 0) {
      if (jestcykl[i]) {
        wynik += sizespoj[i];
      } else
        wynik += sizespoj[i] - 1;
    }
  }
  cout << wynik;
}
