#include<iostream> #include<cstdio> using namespace std; const int maxn = 1010; int father[maxn]; //查找根。 int Find(int x){ while(x != father[x]){ father[x] = father[father[x]]; //路徑壓縮。 x = father[x]; } return x; } //合併操做 void Union(int a,int b){ int ax = Find(a); int bx = Find(b); if(ax != bx){ father[ax] = bx; } } int main(){ int N,M; while(~scanf("%d",&N)){ if(N == 0) break; cin>>M; //初始化。 for(int i = 1; i <= N; i++){ father[i] = i; } int a,b; for(int i = 1; i <= M; i++){ cin>>a>>b; Union(a,b); } int res = 0; for(int i = 1; i <= N; i++){ if(father[i] == i) res++; } cout<<res-1<<endl; } return 0; }