///hopcroft-karp
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int maxn = 200;
const int inf = 65535;
int Mx[maxn], My[maxn];
bool vis[maxn];
int g[maxn][maxn];
int dx[maxn], dy[maxn];
int n, m;
int search(){
queue<int>q;
int dis = inf;
memset(dx, -1, sizeof(dx));
memset(dy, -1, sizeof(dy));
while(!q.empty()) q.pop();
for(int i=1; i<=n; i++){
if(Mx[i] == -1){
q.push(i);
dx[i] = 0;
}
}
while(!q.empty()){
int u = q.front();
q.pop();
if(dx[u] > dis)
break;
for(int v=1; v<=m; v++){
if(g[u][v] && dy[v] == -1){
dy[v] = dx[u] + 1;
if(My[v] == -1){
dis = dy[v];
}
else{
dx[My[v]] = dy[v] + 1;
q.push(My[v]);
}
}
}
}
return dis<inf;
}
int dfs(int u){
for(int v=1; v<=m; v++){
if(g[u][v] && !vis[v] && dy[v] == dx[u] + 1){
vis[v] = true;
if(My[v] == -1 || dfs(My[v])){
My[v] = u;
Mx[u] = v;
return 1;
}
}
}
return 0;
}
int hungary(){
int ans = 0;
memset(Mx, -1, sizeof(Mx));
memset(My, -1, sizeof(My));
while(search()){
for(int u=1; u<=n; u++){
memset(vis, false, sizeof(vis));
if(Mx[u] == -1){
if(dfs(u))
ans ++;
}
}
}
return ans;
}
int main(){
int k;
while(cin >> n && n){
cin >> m >> k;
memset(g, 0, sizeof(g));
int j, u, v;
for(int i=0; i<k; i++){
cin >> j >> u >> v;
g[u][v] = 1;
}
int ans = hungary();
cout << ans << endl;
}
return 0;
}