//如果只是输出有多少个团伙,那么只要比较pre[i]==i即可,但是若要求将不同的组织分行打印出来,那么需要注意要再压缩一次路径,即再find()一次~
#include <stdio.h>
int pre[101];
void merge(int b,int c);
int find(int i);
int main()
{
int i,m,n,c,d,sum,ok;
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++)
pre[i]=i;
for (i=1;i<=m;i++)
{
scanf("%d%d",&c,&d);
merge(c,d);
}
sum=0;
for (i=1;i<=n;i++)
if (pre[i]==i)
sum++;
printf("%d\n",sum);
sum=1;
for (i=1;i<=n;i++)
find(i);
while (sum<=n)
{
ok=0;
for (i=1;i<=n;i++)
if (pre[i]==sum)
{
ok=1;
printf("%d ",i);
}
if (ok)
printf("\n");
sum++;
}
return 0;
}
int find(int i)
{
int j=i,temp;
while (pre[i]!=i)
i=pre[i];
while (j!=i)
{
temp=pre[j];//先记录下下一个长官
pre[j]=i;//统一都更新为i的手下
j=temp;//迭代
}
return i;
}
void merge(int b,int c)
{
int t1,t2;
t1=find(b);
t2=find(c);
if (t1!=t2)
pre[t2]=t1;
return;
}