#include<bits/stdc++.h>
using namespace std;
int n,s,t,head[50005],nxt[50005],vet[50005],dep[50005],cur[50005],en=1;
bool vis[50005];long long wei[50005],maxflow;
void addedge(int u,int v,int w){
vet[++en]=v;wei[en]=w;nxt[en]=head[u];head[u]=en;
}
bool bfs(){
for(int i=0;i<=n;i++)cur[i]=head[i],dep[i]=0x3f3f3f3f,vis[i]=0;
queue<int>que;que.push(s);dep[s]=0;
while(!que.empty()){
int u=que.front();que.pop();vis[u]=0;
for(int i=head[u];i;i=nxt[i]){
int v=vet[i];
if(dep[v]>dep[u]+1&&wei[i]){
dep[v]=dep[u]+1;
if(vis[v]==0){
que.push(v);
vis[v]=1;
}
}
}
}
if(dep[t]!=0x3f3f3f3f)return 1;
return 0;
}
long long dfs(int u,long long flow){
long long rlow=0;
if(u==t){
maxflow+=flow;
return flow;
}
long long used=0;
for(int i=cur[u];i;i=nxt[i]){
cur[u]=i;
int v=vet[i];
if(wei[i]&&dep[v]==dep[u]+1){
if(rlow=dfs(v,min(flow-used,wei[i]))){
used+=rlow;
wei[i]-=rlow;
wei[i^1]+=rlow;
if(used==flow)break;
}
}
}
return used;
}
long long Dinic(){
while(bfs()){
dfs(s,0x3f3f3f3f);
}
return maxflow;
}
bool flag[1005][1005];
signed main(){
int nn,m,e;cin>>nn>>m>>e;
for(int i=1;i<=e;i++){
int x,y;cin>>x>>y;
y+=nn;
if(flag[x][y])continue;
flag[x][y]=1;
addedge(x,y,1);
}
n=nn+m+2;
s=nn+m+1;t=nn+m+2;
for(int i=1;i<=nn;i++)addedge(s,i,1);
for(int i=nn+1;i<=nn+m;i++)addedge(i,t,1);
cout<<Dinic()<<'\n';
return 0;
}