#include <stdio.h>
#include <stdlib.h>
#define MAXN 100001
int con=1,ind[MAXN],next[2*MAXN],y[2*MAXN],viz[MAXN],ind1[MAXN],next1[2*MAXN],x[2*MAXN],viz1[MAXN];
void DFS(int nod){
int p;
viz[nod]=con;
p=ind[nod];
while(p>0){
if(viz[y[p]]==0)
DFS(y[p]);
p=next[p];
}
viz1[nod]=con;
p=ind1[nod];
while(p>0){
if(viz1[x[p]]==0)
DFS(x[p]);
p=next1[p];
}
}
int main(){
FILE*fi,*fout;
int i,n,m,p;
fi=fopen("dfs.in" ,"r");
fout=fopen("dfs.out" ,"w");
fscanf(fi,"%d%d" ,&n,&m);
p=1;
for(i=1;i<=m;i++){
fscanf(fi,"%d%d" ,&x[p],&y[p]);
if(x[p]!=y[i]){
next[p]=ind[x[p]];
ind[x[p]]=p;
next1[p]=ind1[y[p]];
ind1[y[p]]=p;
p++;
}
}
for(i=1;i<=n;i++)
if(viz[i]==0){
DFS(i);
con++;
}
fprintf(fout,"%d" ,con-1);
fclose(fi);
fclose(fout);
return 0;
}