//最小顶点覆盖数=最大匹配数
#include <cstdio>
#include <cstring>
const int maxn=1501;
int k;
int map[maxn][maxn];
int xlink[maxn],ylink[maxn];
bool visit[maxn];
int le[maxn];
bool find(int u)
{
for(int i=0; i<le[u]; ++i)
{
if(!visit[map[u][i]])
{
visit[map[u][i]]=true;
if(ylink[map[u][i]]==-1||find(ylink[map[u][i]]))
{
ylink[map[u][i]]=u; xlink[u]=map[u][i];
return true;
}
}
}
return false;
}
int maxmatch()
{
int ret=0;
memset(xlink,-1,sizeof(xlink));
memset(ylink,-1,sizeof(ylink));
for(int u=0; u<k; ++u)
{
if(xlink[u]==-1)
{
memset(visit,false,sizeof(visit));
if(find(u)) ret++;
}
}
return ret;
}
int main()
{
while(scanf("%d",&k)!=EOF)
{
int x,y,number;
memset(map,-1,sizeof(map));
memset(le,0,sizeof(le));
for(int i=1; i<=k; ++i)
{
scanf("%d:(%d)",&x,&number);
for(int j=1; j<=number; ++j)
{
scanf("%d",&y);
map[x][le[x]++]=y;
map[y][le[y]++]=x;
}
}
printf("%d\n",maxmatch()/2);
}
return 0;
}