#include<bits/stdc++.h>
using namespace std;
bool bo[1100000];
long long zs,tot,n,m,x,y,to[1100000],head[1100000],ermi[1100000],nex[1100000],ans;
void addd(long long x,long long y){
	tot++;
	to[tot]=y;
	nex[tot]=head[x];
	head[x]=tot;
}
void dfs(long long x,long long depth){
	zs++;
	if (zs>2)
		ans=(ans+(ermi[m-depth]*ermi[depth-2])%1000000007)%1000000007;
	else
		ans=(ans+ermi[m-depth])%1000000007;
	bo[x]=true;
	for (int i=head[x];i;i=nex[i]){
		y=to[i];
		if ((!bo[y]))
			dfs(y,depth+1);
	}
	bo[x]=false;
}
int main(){
freopen("barrack.in","r",stdin);
freopen("barrack.out","w",stdout);
scanf("%lld%lld",&n,&m);
ermi[0]=1;
for (int i=1;i<=m;i++)
	ermi[i]=(ermi[i-1]*2)%1000000007;
ans=0;
if ((n<=16)&&(m<=25)){
	for (int i=1;i<=m;i++){
		scanf("%lld%lld",&x,&y);
		addd(x,y);
		addd(y,x);
	}
	for (int i=1;i<=n;i++){
		dfs(i,0);
	}
	printf("%lld",ans);
}
return 0;
}
