#include <cstdio> #include <cstring> #include <iostream> using namespace std; #define MAX 210 int g[MAX][MAX],vis[MAX],link[MAX]; int n,m; int dfs(int x){ for(int i = 1;i <= m;i++){ if(g[x][i] && vis[i] == 0){ vis[i] = 1; if(link[i] == -1 || dfs(link[i])){ link[i] = x; return 1; } } } return 0; } int main(){ while(~scanf("%d%d",&n,&m)){ int x,xx; memset(g,0,sizeof(g)); memset(link,-1,sizeof(link)); for(int i = 1;i <= n;i++){ scanf("%d",&x); for(int j = 1;j <= x;j++){ scanf("%d",&xx); g[i][xx] = 1; } } int ans = 0; for(int i = 1;i <= n;i++){ memset(vis,0,sizeof(vis)); if(dfs(i)) ans++; } cout<<ans<<endl; } return 0; }