#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 2e5 + 10,inf = 0x3f3f3f3f;
vector<int> g[N];
int R[N];
int vis[N];
int n,m,e;
int dfs(int x)
{
for(int i = 0; i < g[x].size(); i++) //遍历左部x可以链接的每一个右部y
{
int y = g[x][i];
if(vis[y] == 0){ //左部x尝试和右部y匹配
vis[y] = 1;
if(R[y] == 0 || dfs(R[y])){
//=0说明y之前没有和其他左部匹配,那么匹配成功
//!=0说明y和其他左部匹配了,那么看看左部R[y]能不能修改匹配
//值得注意的是此时是vis[y]=1,所以左部R[y]修改匹配时不会再和当前的y重新匹配
R[y] = x; //dfs(R[y])看着像左部x把本来属于左部R[y]的y抢走了...
return 1; //找到了x的匹配边
}
}
}
return 0;//找不到
}
int main()
{
cin >> n >> m >> e;
for(int i = 1; i <= e; i++)
{
int x,y; cin >> x >> y;
g[x].push_back(y); //左部x和右部y链接
}
int ans = 0;
for(int i = 1; i <= n; i++)
{
memset(vis,0,sizeof(vis));
if(dfs(i)) ans++; //第i个点可以提供匹配边
}
cout << ans;
return 0;
}