#include<stdio.h>
int p[1000];
int Find(int i)
{
return i==p[i]?i:p[i]=Find(p[i]);
}
void Union(int a,int b)
{
p[a]=b;
}
int main()
{
int n,m,i,s,e,a,b,ans;
while(scanf("%d",&n)!=EOF,n)
{
scanf("%d",&m);
for(i=1;i<=n;i++)
p[i]=i;
while(m--)
{
scanf("%d%d",&s,&e);
a=Find(s);
b=Find(e);
if(a!=b)
p[a]=b;
}
for(ans=0,i=1;i<=n;i++)
if(p[i]==i)
ans++;
printf("%d\n",ans-1);
}
return 0;
}
/**************************************************************
Problem: 2203
User: admin
Language: C++
Result: Accepted
Time:9 ms
Memory:1148 kb
****************************************************************/