#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int pre[1050];
bool root[1050];
int Find(int x){//找到根节点
int r=x;
while(r!=pre[r])
r=pre[r];
int i=x,j;
while(pre[i]!=r){
j=pre[i];
pre[i]=r;
i=j;
}
return r;
}
void mix(int x,int y){//如果两个叶子的根节点不是同一个,强行合并为同一个
int fx=Find(x),fy=Find(y);
if(fx!=fy)
pre[fx]=fy;
}
int main(void) {
#ifndef ONLINE_JUDGE
freopen("E:\\input.txt","r",stdin);
#endif // ONLINE_JUDGE
ios::sync_with_stdio(false);
int n,m,a,b,ans;
while(cin>>n>>m&&n){
for(int i=1;i<=n;i++)
pre[i]=i;//第一开始大家都是孤立的,每一个结点的根节点都是自己
for(int i=1;i<=m;i++)
cin>>a>>b,mix(a,b);//开始建立关系
memset(root,0,sizeof root);
for(int i=1;i<=n;i++)
root[Find(i)]=1;//找到根节点的位置
ans=0;
for(int i=1;i<=n;i++)
if(root[i])//统计根节点的总数
ans++;
cout<<ans-1<<endl;
}
return 0;
}