#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN = 1000;
int father[MAXN];
int height[MAXN];
void Initial(int n){
for(int i = 0; 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] ++;
}
}
return ;
}
int main(int argc, char** argv) {
int n, m;
while(scanf("%d", &n) != EOF){
if(n == 0){
break;
}
scanf("%d", &m);
Initial(n);
while(m--){
int x, y;
scanf("%d %d", &x, &y);
Union(x, y);
}
int answer = -1;
for(int i = 1; i <= n; i++){
if(Find(i) == i){
answer++;
}
}
cout << answer << endl;
}
return 0;
}