#include<stdio.h>
#define MAX 30005
int a[MAX],pre[MAX];
int find(int x)
{
if(x!=pre[x])
//找到其祖先节点
pre[x] = find(pre[x]);
//由父节点继续向上递归查询 ,并将其父节点变成找到的
return pre[x];
}
void merge(int x,int y)
{
//分别查询两点的祖先节点。
int prex = find(x);
int prey = find(y);
//如果二者的祖先节点不一致,那么任意让二者中某一个认另一个为祖先,保证同集合。
if(prex == prey)
{
return ;
}
//应该是祖先节点进行组合。而不是当前节点!
pre[prey] = prex;
a[prex] += a[prey];
}
int main()
{
int n,m;
int k,x,y;
while(~scanf("%d%d",&n,&m))
{
if(n==0&&m==0)
{
return 0;
}
for(int i=0;i<n;i++)
{
//先将自身作为祖先节点。
pre[i] = i;
a[i] = 1;
}
for(int i=0;i<m;i++)
{
//给出集合每个集合人数,以及第一个人的编号
scanf("%d%d",&k,&x);
k--;
while(k--)
{
scanf("%d",&y);
merge(x,y);
}
}
printf("%d\n",a[find(0)]);
}
return 0;
}