KEY
小的数当根
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int const max_person = 30000+5;
int const max_group = 500+5;
int rank[max_person];
int father[max_person];
void init(int n){
for(int i=0;i<n;i++)
{
//rank[i] = 0;
father[i] = i;
}
}
int find(int x){
if(x!=father[x])
father[x] = find(father[x]);
return father[x];
}
void join(int a,int b){
a = find(a);
b = find(b);
if(a!=b)
{
int Father = min(a,b);
int son = max(a,b);
father[son] = Father;
}
}
int main()
{
//freopen("input","r",stdin);
//freopen("output","w",stdout);
int n,m;
while(scanf("%d%d",&n,&m)&&(n+m))
{
int p_num,id,first,head,cnt;
cnt = 0;
init(n);
for(int i=0;i<m;i++)
{
first = 1;
scanf("%d",&p_num);
if(p_num>1)
{
for(int j=0;j<p_num;j++)
{
scanf("%d",&id);
if(first) {head=id;first = 0;}
else join(head,id);
//cout<<"zu "<<i<<" id "<<id<<" :"<<find(id)<<endl;
}
}
else
{
for(int j=0;j<p_num;j++)
{
scanf("%d",&id);
}
}
}
for(int i=0;i<n;i++)
{
if(find(i)==0) cnt++;
}
cout<<cnt<<endl;
}
return 0;
}