#include <stdio.h>
#include <string.h>
#define max_N 1000
int par[max_N];
int rank[max_N];
void init(int n)//初始化par
{
for(int i=1;i<=n;i++)
{
par[i]=i;
rank[i]=0;
}
}
int find(int x)//查找x的根节点
{
while(x!=par[x])
{
x=par[x];
}
return x;
}
void unite(int x,int y)
{
x=find(x);//x的根节点
y=find(y);//y的根节点
if(x==y)
return;
if(rank[x]<rank[y])//将深度大的树的根节点作为深度小的根节点
{
par[x]=y;
}
else{
par[y]=x;
if(rank[x]==rank[y])//如果两棵树的深度相同 各相加一
rank[x]++;
}
}
int main()
{
int N,M;
while(scanf("%d",&N)&&N&&scanf("%d",&M))
{
int sum=0;
init(N);
int a,b;
for(int i=0;i<M;i++)
{
scanf("%d%d",&a,&b);
unite(a,b);
}
for(int i=1;i<=N;i++)
{
if(par[i]==i)//通过判断根节点数目来判断各集合数目
{
sum++;
}
}
printf("%d\n",sum-1);
}
return 0;
}