#include <bits/stdc++.h>
using namespace std;
int n1, n2, m, s, t, ans, d, cnt;
int head[1007], dis[1007], head2[1007];
struct Node
{
int to, w, nxt;
}a[110007];
void add(int u, int v, int w = 0)
{
a[++ cnt].to = v;
a[cnt].w = w;
a[cnt].nxt = head[u];
head[u] = cnt;
}
bool bfs(int s)
{
memset (dis, -1, sizeof dis);
queue <int> q;
q.push(s);
dis[s] = 1;
while (q.empty() == false)
{
int u = q.front();
q.pop();
for (int i = head[u]; i; i = a[i].nxt)
{
int v = a[i].to, w = a[i].w;
if (dis[v] != -1 || !w)
continue;
dis[v] = dis[u] + 1;
q.push(v);
}
}
return dis[t] != -1;
}
int dfs(int u, int flow)
{
int sum = 0;
if (u == t)
return flow;
for (int &i = head2[u]; i; i = a[i].nxt)
{
int v = a[i].to, w = a[i].w;
if (!w || dis[u] + 1 != dis[v])
continue;
int minn = dfs (v, min (flow, w));
if (minn)
{
a[i].w -= minn;
a[i ^ 1].w += minn;
return minn;
}
}
return 0;
}
void dinic()
{
while (bfs(s))
{
for (int i = 0; i <= t; ++ i)
head2[i] = head[i];
while ((d = dfs (s, INT_MAX)) && d)
ans += d;
}
}
int main ()
{
cin >> n1 >> n2 >> m;
t = n1 + n2 + 1;
while (m --)
{
int u, v;
cin >> u >> v;
add(u, v + n1, 1);
add(v + n1, u);
}
for (int i = 1; i <= n1; ++ i)
add(s, i, 1), add(i, s);
for (int i = 1; i <= n2; ++ i)
add(t, i + n1), add(i + n1, t, 1);
dinic();
cout << ans;
return 0;
}