模板
#include<iostream>
#include<cstdlib>
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
queue<int> q;
struct Edge
{
int to,cap;
}b[20005];
int fst[505],nxt[20005],tot=1;
int cur[505];
int inf=214748364;
void build(int f,int t,int d)
{
b[++tot].to=t;
b[tot].cap=d;
nxt[tot]=fst[f];
fst[f]=tot;
}
int d[505];
int s,t;
bool bfs()
{
q.push(s);
memset(d,0,sizeof(d));
d[s]=1;
int u,v;
while(!q.empty())
{
u=q.front();
q.pop();
for(int i=fst[u];i;i=nxt[i])
{
v=b[i].to;
if(b[i].cap>0&&!d[v])
{
d[v]=d[u]+1;
q.push(v);
}
}
}
if(d[t])
return true;
return false;
}
int dfs(int u,int a)
{
if(u==t||a==0)
return a;
int ans=0,v;
int &i=cur[u];
int f;
for(;i;i=nxt[i])
{
v=b[i].to;
if(d[v]==d[u]+1&&b[i].cap>0)
{
int f=dfs(v,min(a,b[i].cap));
ans+=f;
b[i].cap-=f;
b[i^1].cap+=f;
a-=f;
if(a==0) break;
}
}
return ans;
}
int Maxflow()
{
int flow=0;
while(bfs())
{
for(int i=1;i<=t;i++)
cur[i]=fst[i];
flow+=dfs(s,inf);
}
return flow;
}
void insert(int ss,int tt,int d)
{
build(ss,tt,d);
build(tt,ss,0);
}
int main()
{
int n,f,d;
scanf("%d%d%d",&n,&f,&d);
s=n+n+f+d+1;
t=n+n+f+d+2;
int x=2*n+1;
for(int i=x;i<x+f;i++)
insert(s,i,1);
x+=f;
for(int i=x;i<x+d;i++)
insert(i,t,1);
for(int i=1;i<=n;i++)
insert(i,i+n,1);
int fi,di,ff;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&fi,&di);
for(int j=1;j<=fi;j++)
{
scanf("%d",&ff);
insert(ff+2*n,i,1);
}
for(int j=1;j<=di;j++)
{
scanf("%d",&ff);
insert(i+n,ff+2*n+f,1);
}
}
printf("%d",Maxflow());
}