#include <cstdio>
#include <algorithm>
using namespace std;
struct Edge{
int to, cap, next;
Edge(){}
Edge(int _t, int _w, int _n): to(_t), cap(_w), next(_n){}
}e[50000];
int fir[410] = {0}, cur[410], cnt = 1;
inline void ins(int u, int v, int w){
e[++cnt] = Edge(v, w, fir[u]); fir[u] = cnt;
e[++cnt] = Edge(u, 0, fir[v]); fir[v] = cnt;
}
int sour, sink;
int lev[410], vis[410], bfn = 0;
int q[410], h, t;
inline bool bfs(){
h = t = 0;
q[t++] = sour;
vis[sour] = ++bfn;
lev[sour] = 1;
while(h != t){
for(int i = fir[q[h]]; i; i = e[i].next){
if(!e[i].cap || vis[e[i].to] == bfn) continue;
vis[e[i].to] = bfn;
lev[e[i].to] = lev[q[h]] + 1;
q[t++] = e[i].to;
}
h++;
}
return vis[sink] == bfn;
}
int dfs(int now, int flow){
if(now == sink) return flow;
int t, ret = 0;
for(int &i = cur[now]; i; i = e[i].next){
if(!e[i].cap || lev[e[i].to] != lev[now] + 1) continue;
t = dfs(e[i].to, min(flow, e[i].cap));
ret += t;
flow -= t;
e[i].cap -= t;
e[i ^ 1].cap += t;
if(!flow) break;
}
if(!ret) lev[now] = 0;
return ret;
}
int N, F, D;
int main(){
scanf("%d %d %d", &N, &F, &D);
sour = 0;
sink = N * 2 + F + D + 1;
for(int i = 1; i <= N; i++) ins(i, i + N, 1);
for(int i = 1; i <= F; i++) ins(sour, i + 2 * N, 1);
for(int i = 1; i <= D; i++) ins(i + F + 2 * N, sink, 1);
for(int f, d, t, i = 1; i <= N; i++){
scanf("%d %d", &f, &d);
for(int j = 1; j <= f; j++){
scanf("%d", &t);
ins(t + 2 * N, i, 1);
}
for(int j = 1; j <= d; j++){
scanf("%d", &t);
ins(i + N, t + 2 * N + F, 1);
}
}
int ans = 0;
while(bfs()){
for(int i = sour; i <= sink; i++) cur[i] = fir[i];
ans += dfs(sour, 1 << 30);
}
printf("%d\n", ans);
return 0;
}