#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<stack>
using namespace std;
int n,m,u,v,tot,dfn[10001],low[10001],ans;
vector<int> g[10001];
stack<int> s;
bool ins[10001];
void tarjan(int u){
	dfn[u]=low[u]=++tot;
	s.push(u);
	ins[u]=true;
	for(int i=0;i<g[u].size();i++){
		int v=g[u][i];
		if(!dfn[v])tarjan(v),low[u]=min(low[u],low[v]);
		else if(ins[v])low[u]=min(low[u],dfn[v]);
	}
	if(dfn[u]==low[u]){
		int cnt=0;
		do{
			cnt++;
			v=s.top();
			s.pop();
			ins[v]=false;
		}while(u!=v);
		ans+=cnt>1;
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)scanf("%d%d",&u,&v),g[u].push_back(v);
	for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
	printf("%d",ans);
}