#include <stdio.h>
int t[1001];
int findRoot(int x)
{
if(t[x] == x)
return x;
else
{
//若达到了递归结束的条件,则每一层递归返回值都是根节点编号
int temp = findRoot(t[x]);
t[x] = temp;
return temp;
}
}int main()
{
int n, m;
while(scanf("%d%d", &n, &m) != EOF)
{
if(n == 0)
break;
for(int i = 1; i <= n; i++)
t[i] = i;
int a, b;
for(int i = 1; i <= m; i++)
{
scanf("%d%d", &a, &b);
//在并查集中插入元素时要先判断两个元素的根节点是否相同
a = findRoot(a);
b = findRoot(b);
if(a != b)
t[a] = b;
}
int ans = 0;
for(int i = 1; i <= n; i++)
{
//这里只需判断根节点
if(t[i] == i)
ans++;
}
printf("%d\n", ans-1);
}
return 0;
}