#include <bits/stdc++.h>
#include <vector>
using namespace std;
int city_num, road_num;
int one_city, another_city;
int a, b;
int single;
int main() {
while (cin >> city_num &&
city_num) { // 当城镇数目为0时,输入结束,该用例不被处理。
cin >> road_num;
vector<int> root(city_num + 1, -1); //所有人的祖先都初始化为-1
single = city_num; //一开始所有城市,每个城市都是一个个体
while (road_num--) {
cin >> one_city >> another_city; //输入两个城市
//看看这两个城市在不在一个集合
a = one_city;
b = another_city;
while (root[a] != -1) a = root[a];
while (root[b] != -1) b = root[b];
//不在一个集合,所以要合并
if (a != b) {
root[a] = b; //这一步就是合并,写root[b]=a也可
single--;//至少有两个城市进行了合并,那么合并的这两个城市可以看作新的一个个体,总的来说数量少了一个,合二为一
} else continue; //在一个集合,不需要合并,同时说明这个边的加入对single数量不影响
}
cout << single - 1 <<
endl; //将所有边处理完毕以后剩下single个独立个体,遵循n个顶点最少n-1条边的原则
}
}
// 64 位输出请用 printf("%lld")