/*
http://acm.hdu.edu.cn/showproblem.php?pid=1232
merge 写错了,测试用例结果却还是正确的, 浪费了很长的时间
以后注意要!!!!!!!!!!!!!
*/
#include <stdio.h>
#include <string.h>
int pa[1010];
int temp[1010];
int find(int x)
{
return pa[x]==x?x:find(pa[x]);
}
int len(int x)
{
int cnt=0;
int p = pa[x];
while(p!=x)
{
cnt++;
x=p;
p=pa[x];
}
return cnt;
}
void merge(int x, int y)
{
int px=len(x),py=len(y);
int rootx,rooty;
rootx=find(x);
rooty=find(y);
if(rootx==rooty) return ;
if(px>py)
pa[rooty]=rootx; // 注意!!!!!!!!!!!! 是 pa[rooty]=rootx 而不是 pa[y]=x!!!!!!!!!!
else
pa[rootx]=rooty;
}
int main()
{
freopen("input.txt","r",stdin);
int n,m;
while(scanf("%d",&n)&&n)
{
scanf("%d",&m);
memset(temp,0,sizeof(temp));
int i,a,b;
for(i=0; i<1010; i++) pa[i]=i;
for(i=1; i<=m; i++)
{
scanf("%d %d",&a,&b);
merge(a,b);
}
int cnt=0;
for(i=1; i<=n; i++)
{
if(find(i)!=i) temp[i]=1;
}
for(i=1; i<=n; i++)
if(!temp[i]) cnt++;
printf("%d\n",cnt-1);
}
return 0;
}
/*
http://acm.hdu.edu.cn/showproblem.php?pid=1232
*/
#include <stdio.h>
#include <string.h>
int pa[1010];
/*
int find(int x)
{
return pa[x]==x?x:find(pa[x]);
}
*/
int find(int x)
{
int p = pa[x];
while(p!=x)
{
x = p;
p = pa[x];
}
return p;
}
int len(int x)
{
int cnt=0;
int p = pa[x];
while(p!=x)
{
cnt++;
x=p;
p=pa[x];
}
return cnt;
}
int merge(int x, int y)
{
int px=len(x),py=len(y);
int rootx,rooty;
rootx=find(x);
rooty=find(y);
if(rootx==rooty)
return 0;
if(px>py)
pa[rooty]=rootx;
else
pa[rootx]=rooty;
return 1;
}
int main()
{
freopen("input.txt","r",stdin);
int n,m;
while(scanf("%d %d",&n,&m)&&n)
{
int i,a,b;
int cnt=n-1;
for(i=0; i<1010; i++) pa[i]=i;
for(i=1; i<=m; i++)
{
scanf("%d %d",&a,&b);
if(merge(a,b))
cnt--;
}
printf("%d\n",cnt);
}
return 0;
}