#include<bits/stdc++.h>
using namespace std;
pair<int,int>a[200010];
int n,k;
const int N=45100,M=500010;
int h[N],e[M],ne[N],w[N],idx;
void add(int a,int b,int c){e[++idx]=b;w[idx]=c;ne[idx]=h[a];h[a]=idx;}
int dist[N];
bool bfs(){
for(int i=0;i<=2*n+1;i++) dist[i]=-1;
dist[0]=0;
queue<int>q;
q.push(0);
while(q.size()){
int t=q.front();q.pop();
for(int i=h[t];i;i=ne[i]){
int j=e[i];
if(w[i]>0&&dist[j]==-1){
dist[j]=dist[t]+1;
q.push(j);
}
}
}
return dist[2*n+1]>=0;
}
int work[N];
int dfs(int u,int flow){
if(u==n*2+1) return flow;
for(int&i=work[u];i;i=ne[i]){
int j=e[i];
if(w[i]<=0||dist[j]!=dist[u]+1) continue;
int h=dfs(j,min(flow,w[i]));
if(h>0){
w[i]-=h;
w[i^1]+=h;
return h;
}
}
return 0;
}
int dinic(){
int ans=0;
while(bfs()){
for(int i=0;i<=2*n+1;i++) work[i]=h[i];
while(1){
int v=dfs(0,0x3f3f3f3f);
if(v==0) break;
ans+=v;
}
}
return ans;
}
int main(){
idx=1;
scanf("%d%d",&n,&k);
for(int i=1;i<=k;i++) scanf("%d%d",&a[i].first,&a[i].second);
sort(a+1,a+k+1);
k=unique(a+1,a+k+1)-a-1;
random_shuffle(a+1,a+k+1);
for(int i=1;i<=k;i++){
add(a[i].first,a[i].second+n,1);
add(a[i].second+n,a[i].first,0);
}
for(int i=1;i<=n;i++){
add(0,i,1);add(i,0,0);
add(i+n,n*2+1,1);add(n*2+1,i+n,0);
}
int ans=dinic();
printf("%d\n",ans);
return 0;
}