#include<bits/stdc++.h>
using namespace std;
int n,m,lead[1010];
bool vis[1010];
struct edge{
int from;
int to;
}e[10010];
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
int ans=-1;
memset(vis,false,sizeof(vis));
for(int i=1;i<=n;i++)
lead[i]=i;
for(int i=1;i<=m;i++)
{
int f,t;
cin>>f>>t;
e[i].from=f;
e[i].to=t;
if(lead[f]!=lead[t])
{
int tmp=lead[f];
lead[f]=lead[t];
for(int j=1;j<=n;j++)
if(lead[j]==lead[f])
lead[j]=lead[t];
}
}
for(int i=1;i<=n;i++)
if(!vis[lead[i]])
{
vis[lead[i]]=true;
ans++;
}
cout<<ans<<endl;
}
return 0;
}