HDU 1878
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>
#include<map>
#include<stack>
#include<set>
#include<queue>
using namespace std;
typedef long long ll;
#define me(x) memset(x, -1, sizeof(x))
#define mem(x) memset(x, 0, sizeof(x))
const int MOD = 1e18;
const int N = 2e5 + 5;
ll n, m;
struct node
{
int u, v;
}ed[N];
int id, vis[N], p[N], dep[N];
void add(int u, int v)
{
ed[id].u=u;
ed[id].v=v;
id++;
}
void ini()
{
id=0;
mem(vis);
mem(dep);
for(int i=1; i<=n; i++)
p[i]=i;
}
int Find(ll x)
{
int r=x;
while(r!=p[r])
r=p[r];
int i=x, t;
while(r!=p[i])
{
t=p[i];
p[i]=r;
i=t;
}
return r;
}
void join()
{
for(int i=0; i<id; i++)
{
int x=Find(ed[i].u), y=Find(ed[i].v);
if(x!=y)
p[x]=y;
}
}
int main()
{
int i, j, k, x, l;
int u, v, t;
while(~scanf("%d", &n))
{
if(!n) return 0;
scanf("%d", &m);
ini();
for(i=0; i<m; i++)
{
scanf("%d%d", &u, &v);
add(u,v); add(v,u);
dep[u]++, dep[v]++;
}
join();
k=-1;
for(i=1; i<=n; i++)
{
k=Find(i);
if(!i) m=k;
else if(k!=m) break;
}
if(i<n) {cout<<0<<endl;continue;}
k=0;
for(i=1; i<=n; i++)
{
if(dep[i]%2) {k=1;break;}
}
if(!k)cout<<1<<endl;
else cout<<0<<endl;
}
return 0;
}