#include<bits/stdc++.h>
#define pp pair<int,int> >
#define mp make_pair
#define chk(a)	cout<<#a<<" : "<<a<<"\n";
#define chk2(a,b) cout<<#a<<" : "<<a<<", "<<#b<<" : "<<b<<"\n";
#define chk3(a,b,c) cout<<#a<<" : "<<a<<", "<<#b<<" : "<<b<<", "<<#c<<" : "<<c<<"\n";
#define chk4(a,b,c,d) cout<<#a<<" : "<<a<<", "<<#b<<" : "<<b<<", "<<#c<<" : "<<c<<", "<<#d<<" : "<<d<<"\n";
#define M 1000000007
#define F first
#define S second
using namespace std;
int n;
int powe(int a,int b)
{
	int ans=1;
	while(b)
	{
		if(b&1)
			ans=(ans*a)%M;
		b=b/2;
		a=(a*a)%M;
	}
	return ans;
}
int mini(int a,int b)
{
    if(a<b)
        return a;
        return b;
}
int gcde(int a,int b)
{
	if(b==0)
		return a;
	return gcde(b,a%b);
}

int cap[500008],flow[500008],gng[500008];//2*edges
int d[100010];
vector<int> gph[100010];
int q[100010],ptr[100010];
int id;
void add_edge(int u,int v,int c)
{
        gng[id]=v,cap[id]=c,flow[id]=0;
        gph[u].push_back(id);id++;
        gng[id]=u,cap[id]=0,flow[id]=0;
        gph[v].push_back(id);id++;
}
bool bfs()
{
    int u=1,to;
    int fl,ca;
    memset(d,-1,sizeof(d));

    d[1]=0;
    int sx,ex;
    sx=0;ex=-1;
    q[++ex]=1;
    while(sx<=ex and sx!=-1)
    {
        u=q[sx++];
        for(int i=0;i<gph[u].size();i++)
        {
            int id=gph[u][i];
            to=gng[id];
            ca=cap[id];
            fl=flow[id];
            if(d[to]==-1 and ca-fl>0)
            {
                d[to]=d[u]+1;
                q[++ex]=to;
            }
        }
    }
   // printf("d[n]=%d\n",d[n]);
    return (d[n]!=-1);
}

int dfs(int u,int fl)
{
    int to;
    int ca,f;

    if(u==n)
        return fl;
   // chk(u);

    for(;ptr[u]<gph[u].size();++ptr[u])
    {

        int id=gph[u][ptr[u]];
        to=gng[id];
        ca=cap[id];
        f=flow[id];

        if(ca-f>0 and d[to]==d[u]+1)
        {
            fl=mini(fl,ca-f);
            int df=dfs(to,fl);
            if(df>0)
            {

                flow[id]+=df;
                flow[id^1]-=df;
                return df;
            }
        }
    }
    return 0;
}
int main()
{
    int m,i,u,v,c,cw,bl,j;
    scanf("%d%d%d",&cw,&bl,&m);
    n=cw+bl+2;

    for(i=1;i<=cw;i++)
        add_edge(1,i+1,1);
    for(i=1;i<=bl;i++)
        add_edge(cw+1+i,n,1);

    for(i=0;i<m;i++)
    {
        scanf("%d%d",&u,&v);
        add_edge(1+u,1+cw+v,1);

    }
        int ans=0;
        while(bfs())
        {
            memset(ptr,0,sizeof(ptr));
            while(true)
            {
                int df=dfs(1,1e15);
                if(df==0)
                    break;
                ans+=df;
            }
        }
        printf("%d\n",ans);
        return 0;
}
