http://poj.org/problem?id=1611
#include<cstdio>
#include<algorithm>
using namespace std;
#define MAXN 30005
int pa[MAXN],ran[MAXN];
int find_set(int x){
if(x==pa[x])
return x;
else
return pa[x]=find_set(pa[x]);
}
void un(int x,int y){
int a=find_set(x);
int b=find_set(y);
if(a==b)
return ;
if(ran[a]>ran[b])
pa[b]=a;
else{
pa[a]=b;
if(ran[a]==ran[b])
ran[b]++;
}
}
int main(){
int m,n,k,f,t;
while(scanf("%d%d",&m,&n)&&(m||n)){
for(int i=0;i<m;i++){
pa[i]=i;
ran[i]=0;
}
for(int i=0;i<n;i++){
scanf("%d",&k);
if(k>=1)
scanf("%d",&f);
for(int j=1;j<k;j++){
scanf("%d",&t);
un(f,t);
}
}
int sum=1;
for(int i=1;i<m;i++){
if(find_set(i)==find_set(0))
sum++;
}
printf("%d\n",sum);
}
}