#include <iostream>
using namespace std;
int father[1000];
int height[1000];
void Initial(int n)
{
for(int i=1;i<=n;i++)
{
father[i]=i;
height[i]=0;//树的高度是从根节点到叶子节点的最长路径上的边数
}
}
int Find(int x)
{
if(x!=father[x])father[x]=Find(father[x]);
return father[x];
}
void Union(int x,int y)
{
x=Find(x);
y=Find(y);
if(x!=y)
{
if(height[x]<height[y])father[x]=y;
else if(height[x]>height[y])father[y]=x;
else
{
father[y]=x;
height[x]++;
}
}
}
int main() {
int n,m;
while (cin >>n>>m) {
if(n==0)break;
Initial(n);//给n个城镇都分别创建一棵树
for(int i=1;i<=m;i++)
{
int x,y;cin>>x>>y;
Union(x,y);//合并集合
}
int answer=-1;
for(int i=1;i<=n;i++)
{
if(Find(i)==i)//每个集合的根节点都唯一,当前点就是根节点的话,说明找到了一个新集合
answer++;
}
cout<<answer<<endl;
}
}