1
#include<iostream>
2
using namespace std;
3
#define MAXN 30000
4
#define MAXM 500
5
6
int parent[MAXN];
7
8
void init(int n=MAXN)
9

{
10
int i;
11
for(i=0;i<n;i++)
12
parent[i]=-1;
13
}
14
int find(int x)
15

{
16
if(parent[x]<0)
17
return x;
18
else return parent[x]=find(parent[x]);
19
}
20
21
int Union(int x,int y)
22

{
23
int root1=find(x),
24
root2=find(y);
25
if(root1==root2) return root1;
26
if(parent[root1]<parent[root2])
27
{
28
parent[root1]+=parent[root2];
29
parent[root2]=root1;
30
return root1;
31
}else
{
32
parent[root2]+=parent[root1];
33
parent[root1]=root2;
34
return root2;
35
}
36
}
37
int main()
38

{
39
int n,m,i,j,k,x,root;
40
while( scanf("%d%d",&n,&m)==2 && n!=0 )
41
{
42
init(n);
43
for(i=0;i<m;i++)
44
{
45
scanf("%d",&k);
46
for(j=1;j<=k;j++)
47
{
48
scanf("%d",&x);
49
if(j==1) root=x;
50
root=Union(root,x);
51
}
52
}
53
printf("%d\n",-parent[find(0)]);
54
}
55
return 0;
56
}
#include<iostream>2
using namespace std;3
#define MAXN 300004
#define MAXM 5005

6
int parent[MAXN];7

8
void init(int n=MAXN)9


{10
int i;11
for(i=0;i<n;i++)12
parent[i]=-1;13
}14
int find(int x)15


{16
if(parent[x]<0)17
return x;18
else return parent[x]=find(parent[x]);19
}20

21
int Union(int x,int y)22


{23
int root1=find(x),24
root2=find(y);25
if(root1==root2) return root1;26
if(parent[root1]<parent[root2])27

{28
parent[root1]+=parent[root2];29
parent[root2]=root1;30
return root1;31

}else
{32
parent[root2]+=parent[root1];33
parent[root1]=root2;34
return root2;35
}36
}37
int main()38


{39
int n,m,i,j,k,x,root;40
while( scanf("%d%d",&n,&m)==2 && n!=0 )41

{42
init(n);43
for(i=0;i<m;i++)44

{45
scanf("%d",&k);46
for(j=1;j<=k;j++)47

{48
scanf("%d",&x);49
if(j==1) root=x;50
root=Union(root,x);51
}52
}53
printf("%d\n",-parent[find(0)]);54
} 55
return 0;56
}

