#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <ctype.h>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <deque>
#include <cmath>
using namespace std;
#define MAXN 20005
#define MANM 40005
struct Edge{int v,p;}e[MANM<<1];
int ecnt,h[MAXN];
void AddEdge(int u, int v){
e[++ecnt].v=v;
e[ecnt].p=h[u]; h[u]=ecnt;
}
int link[MAXN],vis[MAXN],cnt;
bool Hdfs(int u){
int v;
for(int i=h[u];i;i=e[i].p){
v=e[i].v;
if(!vis[v]){
vis[v]=1;
if(!link[v] || Hdfs(link[v])){
link[v]=u;
return true;
}
}
}
return false;
}
int Hungary(int n){
for(int i=1;i<=n;++i){
memset(vis,0,sizeof vis);
if(Hdfs(i))cnt++;
}
return cnt;
}
int n,m,k,v;
int main(){
while(~scanf("%d %d",&n,&m)){
memset(h,0,sizeof h); ecnt=0;
memset(link,0,sizeof link); cnt=0;
for(int i=1;i<=n;++i){
scanf("%d",&k);
for(int j=1;j<=k;++j){
scanf("%d",&v);
AddEdge(i,v);
}
}
printf("%d\n",Hungary(n));
}
return 0;