#include <bits/stdc++.h>
using namespace std;
const int N=1010,M=1000010;
int ver[M*2],nxt[M*2],head[N],tot;
int dfn[N],low[N],stk[N],c[N],v[N],n,m,num,top,cnt;
bool hate[N][N],able[N];
vector<int> dcc[N];
void add(int x,int y){
ver[++tot]=y,nxt[tot]=head[x],head[x]=tot;
}
void tarjan(int x){
dfn[x]=low[x]=++num;
if(head[x]==0){
dcc[++cnt].clear();
dcc[cnt].push_back(x);
return;
}
stk[++top]=x;
for(int i=head[x];i;i=nxt[i]){
int y=ver[i];
if(!dfn[y]){
tarjan(y);
low[x]=min(low[x],low[y]);
if(dfn[x]<=low[y]){ //不用管是否是根节点,这里只关注dcc
dcc[++cnt].clear();
dcc[cnt].push_back(x);
do{
dcc[cnt].push_back(stk[top]);
}while(stk[top--]!=y);
}
}else //用于点dcc不用判断父节点
low[x]=min(low[x],dfn[y]);
}
}
bool dfs(int x,int xdcc,int color){
v[x]=color;
for(int i=head[x];i;i=nxt[i]){
int y=ver[i];
if(c[y]!=xdcc)continue;
if(!v[y] && dfs(y,xdcc,3-color) ) return true;
if(v[y] == color ) return true;
}
return false;
}
int main(){
while(cin>>n>>m, n){
memset(head,0,sizeof head);
memset(dfn,0,sizeof dfn);
memset(c,0,sizeof c);
memset(able,0,sizeof able);
memset(hate,false,sizeof hate);
tot=1;
num=top=cnt=0;
for(int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
hate[x][y]=hate[y][x]=true;
}
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
if(!hate[i][j])add(i,j), add(j,i);
for(int i=1;i<=n;i++)
if(!dfn[i]) tarjan(i);
for(int i=1;i<=cnt;i++){
for(int j=0;j<dcc[i].size();j++)
c[dcc[i][j]]=i, v[dcc[i][j]]=0;
if(!dfs(dcc[i][0],i,1))continue;
for(int j=0;j<dcc[i].size();j++)
able[dcc[i][j]]=true;
}
int ans=0;
for(int i=1;i<=n;i++)
if(!able[i]) ans++;
cout<<ans<<endl;
}
return 0;
}