#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
int n,m;
const int N=1e3+10,M=1e6+10;
bool g[N][N];
int to[M],nt[M],idx,h[N];
inline void add(int x,int y){
to[idx]=y;
nt[idx]=h[x];
h[x]=idx++;
}
int timestamp=0;
int dfn[N];
int low[N];
int stk[N],tt=-1;
int root;
vector<int> vct;
bool ok[N];
int cl[N];
bool is_in_bcc[N];
bool dfs(int u,int fa){
cl[u]=(!cl[fa]);
for(int i=h[u];i!=-1;i=nt[i]){
int j=to[i];
if(!is_in_bcc[j]||j==fa) continue;
if(cl[j]==cl[u]) return true;
else if(dfs(j,u)) return true;
}
return false;
}
void check_bcc(){
memset(cl,-1,sizeof(cl));
cl[0]=0;
if(dfs(vct[0],0)){
for(int i=0;i<(int)vct.size();i++){
ok[vct[i]]=true;
}
}
memset(is_in_bcc,0,sizeof(is_in_bcc));
vct.clear();
}
void tarjan(int u){
timestamp++;
low[u]=dfn[u]=timestamp;
stk[++tt]=u;
for(int i=h[u];i!=-1;i=nt[i]){
int j=to[i];
if(!dfn[j]){
tarjan(j);
low[u]=min(low[u],low[j]);
if(dfn[u]<=low[j]){
int t;
do{
t=stk[tt--];
vct.push_back(t);
is_in_bcc[t]=true;
}while(t!=j);
vct.push_back(u);
is_in_bcc[u]=true;
check_bcc();
}
}
else low[u]=min(low[u],dfn[j]);
}
}
inline int read(){
int ret=0;
char ch=' ',c=getchar();
while(!('0'<=c&&c<='9')) ch=c,c=getchar();
while('0'<=c&&c<='9') ret=((ret<<1)+(ret<<3)+c-'0'),c=getchar();
return ch=='-'?-ret:ret;
}
void init(){
memset(h,-1,sizeof(h));
idx=0;
timestamp=0;
tt=-1;
memset(dfn,0,sizeof(dfn));
memset(ok,0,sizeof(ok));
memset(g,0,sizeof(g));
}
int main(){
while(1){
init();
n=read();m=read();
if(n==0&&m==0) break;
int x,y;
for(int i=1;i<=m;i++){
x=read();y=read();
g[y][x]=g[x][y]=true;
}
for(int i=1;i<=n;i++){
g[i][i]=true;
for(int j=1;j<=n;j++){
if(!g[i][j]) add(i,j);
}
}
for(int i=1;i<=n;i++){
if(!dfn[i]){
root=i;
tarjan(root);
}
}
int cnt=0;
for(int i=1;i<=n;i++) cnt+=(!ok[i]);
printf("%d\n",cnt);
}
return 0;
}