#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")