#include<bits/stdc++.h>int p[10100];voidinit(int N){
for(int i =1; i <= N; i++)
p[i]= i;//初始化,使每一个点的根节点编号为自己的编号}intfindd(int x)//查找根节点{
if(p[x]!= x) p[x]=findd(p[x]);return p[x];}voidmerge(int x,int y)//连通(合并)两个节点{
int fx =findd(x);int fy =findd(y);if(fx != fy)//判断x,y是否在同一个连通块
p[fx]= fy;}intmain(){
int n, m, i, x, y, cnt;while(scanf("%d",&n), n){
cnt =0;init(n);scanf("%d",&m);while(m--){
scanf("%d%d",&x,&y);merge(x, y);}for(i =1; i <= n; i++){
if(p[i]== i) cnt++;}printf("%d\n", cnt -1);}}