#define N 1000
#define MAX 0x3f3f3f3f
#define min(x,y) ((x>y)?(y):(x))//定义宏
int map[N][N];//图
int dis[N];//来表示分层图距离
int q[10000],h,r;//手工队列,h为队首,r为队尾
int source,sink;//顶点的最大编号sink,最小编号source=0
int BFS(void)
{
int i,j;
memset(dis,0xff,sizeof(dis));
dis[0]=0;
h=-1;r=0;
q[0]=0;
while(h0)
{
dis[i]=dis[j]+1;//来决定每个点与源点的距离,也就是分层。。。
q[++r]=i;
}
}
}
if(dis[sink]>0)
return 1;
else
return 0;
}
int find(int x,int low)//表示已经到了x顶点,并且此时从源点到x顶点的这一段路中可以达到的最大流量
{
int i,a=0;
if(x==sink)//如果到了汇点,返回最大流量
return low;
for(i=0;i<=sink;i++)
{
if(map[x][i]>0&&dis[i]==dis[x]+1&&(a=find(i,min(low,map[x][i]))))//这就是每一层找一个,然后接着找下一层
{
map[x][i]-=a;//正向边流量增加
map[i][x]+=a;//反向边流量减少
return a;
}
}
return 0;
}
int main()
{
int ans,tans,n,f,d,i,f_sum,d_sum,j,tmp;
while(~scanf("%d%d%d",&n,&f,&d))
{
memset(map,0,sizeof(map));
source=0;sink=2*n+f+d+1;
for(i=1;i<=f;i++)map[source][i]=1;//构建图,这道题有点特殊的构图方式
for(i=1;i<=d;i++)map[2*n+f+i][sink]=1;
for(i=1;i<=n;i++)map[f+i][f+n+i]=1;
for(i=1;i<=n;i++)
{
scanf("%d%d",&f_sum,&d_sum);
for(j=1;j<=f_sum;j++)
{
scanf("%d",&tmp);
map[tmp][f+i]=1;
}
for(j=1;j<=d_sum;j++)
{
scanf("%d",&tmp);
map[f+n+i][2*n+f+tmp]=1;
}
}
ans=0;
while(BFS())
{
while(tans=find(0,0x3f3f3f3f))
ans+=tans;
}
printf("%d\n",ans);
}
}