#include<bits/stdc++.h>
using namespace std;
struct tree{
int u,v;
}trees[499503];
int ans=0,n,m,f[1003],pd[5004],cnt=0;
int find(int x){
if(f[x]==x)return f[x];
return f[x]=find(f[x]);
}
void Kruskal(){
for(int i=1;i<=m;i++){
int x=find(trees[i].u),y=find(trees[i].v);
if(x==y)continue;
f[y]=x;
cnt++;
if(cnt==n-1)break;
}
}
int main(){
while(cin>>n&&n!=0){
ans=0;
cin>>m;
for(int i=1;i<=n;i++)f[i]=i;
for(int i=1;i<=m;i++)cin>>trees[i].u>>trees[i].v;
Kruskal();
for(int i=1;i<=n;i++)pd[i]=0;
for(int i=1;i<=n;i++)pd[find(f[i])]++;
for(int i=1;i<=n;i++){
if(pd[i])ans++;
}
cout<<ans-1<<endl;
}
return 0;
}