/// Hopcroft-Karp+Konig by muoii

/// vn.spoj.com/problems/NKBM/
#include <bits/stdc++.h>
using namespace std;
#define tag "spoj"
#define maxn 10007
#define oo 2000000007
#define meset(a,x) memset(a,x,sizeof(a))
#define loop(x) for(int LoOpEr=x;LoOpEr-->0;)
///>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
int m,n,p;
int d[maxn],mx[maxn],my[maxn];
vector<int> adx[maxn],ady[maxn];
bool mvc[2][maxn];
queue<int> Q;

bool augment()
{
    for(int u=1;u<=m;u++)
        if(!mx[u])
        {
            Q.push(u);
            d[u]=0;
        }
        else d[u]=oo;

    d[0]=oo;

    int u;
    while(Q.size())
    {
        u=Q.front(),Q.pop();

        for(const int &v: adx[u])
            if(d[my[v]]==oo)
            {
                d[my[v]]=d[u]+1;
                Q.push(my[v]);
            }
    }
    return d[0]<oo;
}

bool augmenting(const int &u)
{
    if(d[u]==oo) return false;

    for (const int &v: adx[u])
        if(my[v]==0 || (d[my[v]]==d[u]+1 && augmenting(my[v])))
        {
            mx[u]=v;
            my[v]=u;
            return true;
        }

    return false;
}

int HKarp()
{
    int rep=0;
    meset(mx,0);meset(my,0);
    while(augment())
        for(int u=1;u<=m;u++)
            rep+=(mx[u])?0:augmenting(u);
    return rep;
}

void konig()
{
    meset(mvc,0);
    queue<int> Qx,Qy;
    for(int x=1;x<=m;x++) if(!mx[x]) Qx.push(x);
    for(int y=1;y<=n;y++) if(!my[y]) Qy.push(y);

    int x,y;
    while(Qx.size()+Qy.size())
    {
        if(Qx.size())
        {
            x=Qx.front(),Qx.pop();
            for(const int &v :adx[x])
                if(!mvc[1][v])
                    mvc[1][v]=1,Qx.push(my[v]);
        }

        if(Qy.size())
        {
            y=Qy.front(),Qy.pop();
            for(const int &u: ady[y])
                if(!mvc[0][u])
                    mvc[0][u]=1,Qy.push(mx[u]);
        }
    }

    for(int u=1;u<=m;u++)
        if(mx[u] && !mvc[0][u] && !mvc[1][mx[u]])
            mvc[0][u]=1;

    cout<<"MIN MVC:\n";
    for(int u=1;u<=m;u++) if(mvc[0][u]) cout<<u<<" ";
    cout<<"\n";
    for(int v=1;v<=n;v++) if(mvc[1][v]) cout<<v<<" ";
}
int main()
{
    #ifdef dmdd
    freopen(tag".inp","r",stdin); freopen(tag".out","w",stdout);
    #endif // dmdd
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> m >> n >> p;
    int x,y;
    while (cin>>x>>y)
    {
        adx[x].push_back(y);
        ady[y].push_back(x);
    }

    cout<<HKarp()<<"\n";
    ///konig();
    return 0;
}
