#include<bits/stdc++.h>
using namespace std;
inline int read(){
int res=0;
bool zf=0;
char c;
while(((c=getchar())<'0'||c>'9')&&c!='-');
if(c=='-')zf=1;
else res=c-'0';
while((c=getchar())>='0'&&c<='9')res=(res<<3)+(res<<1)+c-'0';
return (zf?-res:res);
}
int n,m;
int to[800005],head[5005],nxt[800005],val[800005],cnt;
int sx[5005];
int maxflow;
int cur[5005];
inline void addedge(int x,int y,int z){
nxt[cnt]=head[x];
head[x]=cnt;
to[cnt]=y;
val[cnt]=z;
cnt++;
return;
}
inline bool bfs(){
for(register int i=0;i<=n+m+1;i++)cur[i]=head[i],sx[i]=0;
sx[0]=1;
queue<int>Q;
Q.push(0);
while(!Q.empty()){
int x=Q.front();Q.pop();
for(register int i=head[x];i;i=nxt[i]){
if(!val[i]||sx[to[i]])continue;
int v=to[i];
sx[v]=sx[x]+1;
Q.push(v);
}
}
return sx[n+m+1];
}
void dfs(int now,int flow){
if(now==n+m+1){
maxflow+=flow;
return;
}
if(!flow)return;
for(register int i=cur[now];i;i=nxt[i]){
cur[now]=i;
int v=to[i];
if(sx[v]!=sx[now]+1||!val[i])continue;
int w=min(flow,val[i]);
int tmp=-maxflow;
dfs(v,w);
tmp+=maxflow;
flow-=tmp;
val[i]-=tmp;
val[i^1]+=tmp;
}
return;
}
inline void dinic(){
while(bfs())dfs(0,0x7fffffff);
return;
}
signed main(){
n=read(),m=read();int t=read(),x,y;
while(t--)x=read(),y=read()+n,addedge(x,y,0x7ffffff),addedge(y,x,0);
for(register int i=1;i<=n;i++)addedge(0,i,1),addedge(i,0,0);
for(register int i=n+1;i<=n+m;i++)addedge(i,n+m+1,1),addedge(n+m+1,i,0);
dinic();
cout<<maxflow<<'\n';
return 0;
}