#include <bits/stdc++.h>
using namespace std;
const long long inf = 2147383647;
const double pi = 2 * acos(0.0);
const double eps = 1e-9;
struct debugger {
  template <typename T>
  debugger& operator,(const T& v) {
    cerr << v << " ";
    return *this;
  }
} dbg;
inline long long gcd(long long a, long long b) {
  a = ((a) < 0 ? -(a) : (a));
  b = ((b) < 0 ? -(b) : (b));
  while (b) {
    a = a % b;
    swap(a, b);
  }
  return a;
}
int ext_gcd(int a, int b, int& x, int& y) {
  if (a == 0) {
    x = 0;
    y = 1;
    return b;
  }
  int x1, y1;
  int d = ext_gcd(b % a, a, x1, y1);
  x = y1 - (b / a) * x1;
  y = x1;
  return d;
}
inline long long modInv(int a, int m) {
  int x, y;
  ext_gcd(a, m, x, y);
  if (x < 0) x += m;
  return x;
}
inline long long power(long long a, long long p) {
  long long res = 1, x = a;
  while (p) {
    if (p & 1) res = (res * x);
    x = (x * x);
    p >>= 1;
  }
  return res;
}
inline long long bigmod(long long a, long long p, long long m) {
  long long res = 1, x = a % m;
  while (p) {
    if (p & 1) res = (res * x) % m;
    x = (x * x) % m;
    p >>= 1;
  }
  return res;
}
vector<int> adj[100010], two[100010];
int vis[100010];
vector<int> line;
int loop;
void gather(int s) {
  if (vis[s]) return;
  vis[s] = 1;
  line.push_back(s);
  for (int i = (0); i <= (((int)(two[s]).size()) - 1); ++i) {
    int t = two[s][i];
    gather(t);
  }
}
int col[100010];
void topo(int s) {
  if (col[s] != 0) return;
  col[s] = 1;
  for (int i = (0); i <= (((int)(adj[s]).size()) - 1); ++i) {
    int t = adj[s][i];
    if (col[t] == 1) {
      loop = 1;
    } else
      topo(t);
  }
  col[s] = 2;
}
int main() {
  int n, m;
  scanf("%d %d", &n, &m);
  for (int i = (0); i <= (m - 1); ++i) {
    int u, v;
    scanf("%d %d", &u, &v);
    adj[u].push_back(v);
    two[u].push_back(v);
    two[v].push_back(u);
  }
  int res = 0;
  for (int i = (1); i <= (n); ++i) {
    if (vis[i] == 0) {
      loop = 0;
      line.clear();
      gather(i);
      for (int j = (0); j <= (((int)(line).size()) - 1); ++j) {
        int x = line[j];
        if (col[x] == 0) {
          topo(x);
        }
      }
      if (loop)
        res += line.size();
      else
        res += ((int)(line).size()) - 1;
    }
  }
  printf("%d\n", res);
  return 0;
}
