#include<bits/stdc++.h>
#define ll long long
#define rg register
using namespace std;
const int MAXN=35000;
const int Mod=1e9+7;
struct gao{   int A,B;   }Edge[MAXN];
int Ans,End,n,m,Two[MAXN]={1},A[MAXN],B[MAXN],F[3][MAXN];
int main()
{   scanf("%d%d",&n,&m),End=(1<<n)-1;
	for(rg int i=1;i<=m;i++) scanf("%d%d",&Edge[i].A,&Edge[i].B);
	for(rg int i=1;i<=m;i++) Two[i]=(Two[i-1]<<1)%Mod;
	for(rg int i=1;i<=End;i++)
		for(rg int j=1;j<=m;j++)
		{	if((i&(1<<(Edge[j].A-1)))&&(i&(1<<(Edge[j].B-1)))) A[i]++;
			if((i&(1<<(Edge[j].A-1)))||(i&(1<<(Edge[j].B-1)))) B[i]++;
		}
	for(rg int S=1;S<=End;S++)
	{   F[1][S]=Two[A[S]]*(S&1),F[2][S]=Two[A[S]]*(S>>1&1);
		for(rg int T=(S-1)&S;T;T=(T-1)&S)
		{	if(T&1) F[1][S]=(F[1][S]-1ll*F[1][T]*Two[A[S^T]])%Mod;
			if(T&2) F[2][S]=(F[2][S]-1ll*F[2][T]*Two[A[S^T]])%Mod;
		}
	}
	for(rg int S=1;S<=End;S++)
		for(rg int T=(End^S);T;T=(T-1)&(End^S))
		{   if(A[S]+A[T]!=A[S|T]||~S&1||~T&2) continue ;
			Ans=(Ans-1ll*F[1][S]*F[2][T]%Mod*Two[A[End^S^T]])%Mod;
		}
	printf("%lld\n",(1ll*Ans+Two[m]+Mod)%Mod);
}