#include using namespace std; typedef long long ll; typedef long double ld; #define rep(i, a, n) for (int i = (a); i < (n); i++) #define per(i, a, n) for (int i = (n) - 1; i >= (a); i--) #define FOR(i, n) rep(i, 0, (n)) #define fi first #define se second template bool topo_sort(const E& edges, I& idx, int n) { vector indeg(n); rep(i,0,n) for(auto& e : edges[i]) indeg[e]++; queue q; rep(i,0,n) if (indeg[i] == 0) q.push(-i); int nr = 0; while(q.size() > 0) { int i = -q.front(); idx[i] = nr++; q.pop(); for(auto& e : edges[i]) if (--indeg[e] == 0) q.push(-e); } return nr == n; } //char endl = '\n'; int main(void) { ios_base::sync_with_stdio(false); int n, m; cin >> n >> m; vector> gt(n); vector> g(n); rep(i,0,m) { int a, b; cin >> a >> b; a--; b--; gt[b].push_back(a); g[a].push_back(b); } vector deg(n, 0); vector from(n,-1); vector idx(n); topo_sort(g, idx, n); /* rep(i,0,n) cout << idx[i] << " "; cout << endl; rep(a,0,n) { cout << "a!!!" << a << endl; for(auto b : g[a]) { cout << b << " "; } cout << endl; } */ rep(b,0,n) { if (gt[b].empty()) continue; for (auto a : gt[b]) { if (from[b] == -1 || idx[a] > idx[from[b]]) { from[b] = a; } } if (from[b] != -1) { deg[from[b]]++; } } // rep(i,0,n) { // cout << i << " from " << from[i] << endl; // } bool done = false; while(!done) { done = true; rep(a,0,n) { if (from[a] == -1) continue; if (deg[a] == 0) { for (auto b : g[a]) { int c = from[b]; if (deg[c] > 1) { from[b] = a; deg[c]--; deg[a]++; done = false; break; } } } } } int res = n - 2; rep(a,0,n) { if (deg[a] == 0) { res++; } } // rep(a,0,n) cout << deg[a] << " "; cout << endl; cout << (m-res) << endl; return 0; }