//本题编写的匈牙利算法用于解决下面地址的编程题
//https://www.luogu.org/problemnew/show/P1894
#include<iostream>
#include<cstring>
using namespace std;
//邻接矩阵存图
int map[500][500];
//是否已有匹配
int match[500];
int check[500];
//二分图的左右顶点数
int num_left,num_right;
bool dfs(int n)
{
for(int i=num_left+1;i<=num_left+num_right;i++){
if(map[n][i]&&!check[i]){
check[i]=1;
//
if(!match[i]||dfs(match[i])){
//由第二条件进入,则发生重新匹配的过程
match[i]=n;
return true;
}
}
}
return false;
}
int main()
{
cin>>num_left>>num_right;
for(int i=1;i<=num_left;i++){
//左边每个顶点与右边顶点的连接数
int t,to;
cin>>t;
while(t--){
cin>>to;
map[i][num_left+to]=1;
}
}
int ans=0;
for(int i=1;i<=num_left;i++){
if(!match[i]){
memset(check,0,sizeof(check));
//存在增广流,匹配数+1
if(dfs(i))ans++;
}
}
cout<<ans;
return 0;
}