#include<bits/stdc++.h>
using namespace std;
long long read(){
long long x=0,sgn=1;char ch=getchar();
while(ch<'0' || ch>'9'){if(ch=='-')sgn=-1;ch=getchar();}
while(ch>='0' && ch<='9'){x=(x<<3)+(x<<1)+(ch&15);ch=getchar();}
return x*sgn;
}
long long n,m,x,y,k,K,tot,l,r,num,save,aans,b[100010],c[100010],d[100010],t[100010];
long long u[100010],v[100010],nex[100010],poi[100010];
bool vis[10010];
void zao(long long x,long long y){
k++;u[k]=x;v[k]=y;nex[k]=poi[x];poi[x]=k;
}
void dddfs1(long long x){
vis[x]=true;
long long save=poi[x];
while(save>0){
if(save%2==1){
if(vis[v[save]]==false)
dddfs1(v[save]);
}
save=nex[save];
}
num++;
t[num]=x;
}
void dddfs2(long long x){
vis[x]=true;
long long save=poi[x];
while(save>0){
if(save%2==0){
if(vis[v[save]]==false){
b[v[save]]=tot;
c[tot]++;
dddfs2(v[save]);
}
}
save=nex[save];
}
}
int main(){
n=read();m=read();
for(int i=1;i<=m;i++){
x=read();y=read();
zao(x,y);
zao(y,x);
}
for(int i=1;i<=n;i++)
if(vis[i]==0)
dddfs1(i);
memset(vis,0,sizeof(vis));
for(int i=n;i>=1;i--)
if(vis[t[i]]==true)continue;
else{
tot++;
b[t[i]]=tot;
c[tot]++;
dddfs2(t[i]);
}
for(int i=1;i<=tot;i++)
if(c[i]>1)aans++;
printf("%lld\n",aans);
return 0;
}