#include<bits/stdc++.h>
#define rep(i,n) for(int i=1;i<=n;++i)
#define N 55
#define is(x) (x>N?x-N:x)
#define alt(x) (x>N?x-N:x+N)
#define che(x) (x>N?-1:1)
using namespace std;
typedef long long ll;
map<ll,ll>a;
int b[N<<1],v[N*N*4],f[N*N*4],tot=0;
int typ[N],cnt[N],q[N],pos[N],n,m,x,y;
ll col[N<<1];
map<ll,ll>::iterator it;
void add(int x,int y){v[++tot]=y,f[tot]=b[x],b[x]=tot;}
bool cmp(int x,int y){return q[x]>q[y];}
void color(int x,int c){
	col[x]=c,++cnt[c];
	for(int i=b[x];i;i=f[i])
		if(col[v[i]]!=c)color(v[i],c);
}
bool dfs(int x,ll c,ll&tmsk){
	//printf("%d %d\n",x,c);
	if(typ[is(x)]!=0)return typ[is(x)]!=che(x);else typ[is(x)]=che(x),tmsk|=1ll<<(pos[is(x)]-1);
	col[x]=c;
	for(int i=b[x];i;i=f[i])
		if(col[v[i]]!=c){if(dfs(v[i],c,tmsk))return 1;}
	return 0;
}
void pri(){rep(i,n)printf("%d ",typ[i]);puts("");}
ll fuckyzc=0;
ll sol(ll mask){
	//++fuckyzc;if(fuckyzc>10)return fuckyzc;
	//printf("%lld\n",mask);pri();
	it=a.find(mask);
	if(it!=a.end())return it->second;
	ll ans=0,tmsk=0;int tp=0,ts;
	while(!((1ll<<tp)&mask))++tp;++tp;ts=q[tp];//printf("%d\n",ts);
	//typ[ts]=1,tmsk=1<<(tp-1);
	if(!dfs(ts,mask<<1,tmsk))ans+=sol(mask^tmsk);
	rep(i,n)if(tmsk&(1ll<<(i-1)))typ[q[i]]=0;tmsk=0;
	//typ[ts]=-1,tmsk=1<<(tp-1);
	if(!dfs(ts+N,mask<<1|1,tmsk))ans+=sol(mask^tmsk);
	rep(i,n)if(tmsk&(1ll<<(i-1)))typ[q[i]]=0;tmsk=0;
	a.insert(make_pair(mask,ans));
	return ans;
}
int main(){
	scanf("%d%d",&n,&m);a.insert(make_pair(0,1));
	rep(i,m)scanf("%d%d",&x,&y),x=x<0?N-x:x,y=y<0?N-y:y,add(alt(x),y),add(alt(y),x);
	rep(i,n)color(i,i),color(i+N,i),q[i]=i;
	sort(q+1,q+n+1,cmp);rep(i,n)pos[q[i]]=i;
	//printf("%d\n",pos[1]);
	//rep(i,n)printf("%d ",q[i]);puts("");
	memset(col,0,sizeof col);
	printf("%lld\n",sol((1ll<<n)-1));
}
