#include <iostream>
#include <cstdio>
using namespace std;
int Town[1001];
void InitTown()
{
for(int i=0; i<1001;i++)
{
Town[i] = -1;
}
}
int Getfather(int x)
{
int tmp = x;
while(Town[x]!=-1)
{
x = Town[x];
}
int t = x;//保存这条路径上的根节点标号
while(Town[tmp]!=-1)
{
x = Town[tmp];//得到当前节点的双亲节点标号
Town[tmp] = t;//压缩集合路径,将这条路径上的所有点的双亲节点标记为根节点
tmp = x;//访问路径上的下一个节点
}
return t;
}
int main()
{
int n,m;
while(cin>>n&&n!=0)
{
cin>>m;
InitTown();
int a,b;
while(m--)
{
cin>>a>>b;
a = Getfather(a);//得到a集合上的最终根节点
b = Getfather(b);//得到b集合上的最终根节点
if(a != b) //a != b说明ab集合没有相交
{
Town[a] = b;
}
}
int ans = 0;
for(int i =1; i <= n; i++)
{
if(-1 == Town[i]) ans++;//有多少个-1说明有多少个集合;
}
cout<<ans-1<<endl;//集合数减一为道路数
}
}