#include<bits/stdc++.h>
using namespace std;
int head[600000],vet[2000100],net[2000100],lun,ied[2000100];
void nb(int x,int y,int id){
	vet[++lun]=y;
	net[lun]=head[x];
	head[x]=lun;
	ied[lun]=id;
}
int p=1e9+7;
int ksm(int a,int b){
	if(b<=0)return 1;
	int ans=1,sum=a;
	while(b){
		if(b&1)
			ans=1LL*ans*sum%p;
		sum=1LL*sum*sum%p;
		b/=2;
	}
	return ans;
}
int ans=0;
int main(){
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	int n,m;
	scanf("%d%d",&n,&m);
	if(n<=16&&m<=25){
		for(int i=1;i<=m;i++){
			int x,y;
			scanf("%d%d",&x,&y);
			nb(x-1,y-1,i);
			nb(y-1,x-1,i);
		}
		bool jun[20];
		for(int d=1;d<(1<<n);d++){
			for(int i=0;i<n;i++)
			jun[i]=d&(1<<i);
			int dn=0;
				for(int k=1;k<=m;k++){
					for(int i=0;i<n;i++){
						if(jun[i]==0)continue;
						bool isok[20];
						for(int i=0;i<n;i++)
						isok[i]=0;
						isok[i]=1;
						queue<int> t;
						t.push(i);
						while(!t.empty()){
							int x=t.front();
							t.pop();
							for(int e=head[x];e;e=net[e]){
								if(ied[e]==k)continue;
								int y=vet[e];
								if(isok[y]==0){
									isok[y]=1;
									t.push(y);
								}
							}
						}
						for(int i=0;i<n;i++)
						if(jun[i]&&!isok[i]){
							dn++;
							goto NE;
						}
					}
					NE:;
				}
			ans=(ans+ksm(2,m-dn))%p;
		}
	}
	else{
		for(int i=1;i<=n;i++)
		ans=(ans+1LL*(n-i+1)*ksm(2,i-2)%p*ksm(2,n-i)%p)%p;
	}
	printf("%d",ans);
	return 0;
}