#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long ll;
int mp[505][505], vis[505], s, t;
queue<int>qu;
int bfs()
{
int i;
memset(vis, -1, sizeof(vis));
while(!qu.empty())qu.pop();
vis[s] = 1;
qu.push(s);
while(!qu.empty())
{
int w = qu.front();
qu.pop();
for(i = 0; i <= t; i++)
{
if(mp[w][i] > 0 && vis[i] == -1)
{
qu.push(i);
vis[i] = vis[w] + 1;
}
}
}
if(vis[t] == -1)return 0;
else return 1;
}
int dfs(int x, int flow)
{
if(flow <= 0)return 0;
if(x == t)return flow;
int ans = 0;
int i;
for(i = 0; i <= t; i++)
{
if(mp[x][i] > 0 && vis[i] == vis[x] + 1)
{
int xxx = dfs(i, min(flow, mp[x][i]));
if(xxx == 0)continue;
ans += xxx;
mp[i][x] += xxx;
mp[x][i] -= xxx;
return xxx;
}
}
return 0;
}
int max_flow()
{
int ans = 0;
while(bfs())ans += dfs(s, 10000);
return ans;
}
int main()
{
int n, f, d, fi, di, i, j, k;
scanf("%d %d %d", &n, &f, &d);
s = 0;
t = f + 2 *n + d + 1;
for(i = 1; i <= f; i++)
{
mp[s][i] = 1;
mp[i][s] = 0;
}
for(i = f + n * 2 + 1; i <= f + n * 2 + d; i++)
{
mp[i][t] = 1;
mp[t][i] = 0;
}
for(i = 1; i <= n; i++)
{
mp[f + i][f + n + i] = 1;
mp[f + n + i][f + 1] = 0;
scanf("%d %d", &fi, &di);
for(j = 1; j <= fi; j++)
{
scanf("%d", &k);
mp[k][f + i] = 1;
mp[f + i][k] = 0;
}
for(j = 1; j <= di; j++)
{
scanf("%d", &k);
mp[f + n + i][f + n * 2 + k] = 1;
mp[f + n * 2 + k][f + n + i] = 0;
}
}
int ans = max_flow();
printf("%d\n", ans);
return 0;
}