#include<iostream>
#include<cstring>
using namespace std;
int N,M;
int father[30005],a[30005];
int findf(int x) /// 找该节点最顶端的的父亲节点
{
return father[x] == x?x:father[x]=findf(father[x]);
#include<cstring>
using namespace std;
int N,M;
int father[30005],a[30005];
int findf(int x) /// 找该节点最顶端的的父亲节点
{
return father[x] == x?x:father[x]=findf(father[x]);
}
int main()
{
int M,N;
while(cin>>N>>M)
{
if(N == 0 && M == 0)
return 0;
else
{
int k,x,y,n=0;
for(int i=1; i<=N; i++) /// 初始化父亲节点为其本身
father[i]=i;
for(int j=0; j<M; j++)
{
cin>>k;
for(int i=0; i<k; i++)
{
cin>>a[i];
//cout<<a[i]<<endl;
x = findf(a[i]);
y = findf(a[0]);
if(x == 0) /// 队员的祖宗是0,队长放下面
father[y]=x;
else /// 队员的祖宗不为0,队员放下面
father[x]=y;
{
int M,N;
while(cin>>N>>M)
{
if(N == 0 && M == 0)
return 0;
else
{
int k,x,y,n=0;
for(int i=1; i<=N; i++) /// 初始化父亲节点为其本身
father[i]=i;
for(int j=0; j<M; j++)
{
cin>>k;
for(int i=0; i<k; i++)
{
cin>>a[i];
//cout<<a[i]<<endl;
x = findf(a[i]);
y = findf(a[0]);
if(x == 0) /// 队员的祖宗是0,队长放下面
father[y]=x;
else /// 队员的祖宗不为0,队员放下面
father[x]=y;
}
}
for(int i=0; i<N; i++)
{
if(findf(i) == 0)
//{cout<<a[i]<<endl; /// 祖宗为0的,都是患病的
n++;
}
cout<<n<<endl;
}
}
for(int i=0; i<N; i++)
{
if(findf(i) == 0)
//{cout<<a[i]<<endl; /// 祖宗为0的,都是患病的
n++;
}
cout<<n<<endl;
}
}
return 0;
}
return 0;
}