#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
int n,m,U[5005],V[5005],ans;//head[3005],edgenum,vet[10005],Next[10005];
bool flag1[3005],flag2[5005],vis[3005];
int f[3005];
ll q_pow(ll a,ll b){
	ll ans=1;
	while(b>0){
		if(b&1) ans=ans*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return ans;
}
int find(int x){
	if(f[x]!=x) f[x]=find(f[x]);
	return f[x];
}
//void addedge(int u,int v){
//	vet[++edgenum]=v;
//	Next[edgenum]=head[u];
//	head[u]=edgenum;
//}
//void dfs(int u){
//	vis[u]=1;
//	for(int e=head[u];e;e=Next[e]){
//		int v=vet[e];
//		if(!vis[v]) dfs(v);
//	}
//}
bool check(){
	bool ff=0;
	for(int i=1;i<=n;i++)
		if(flag1[i]){
			ff=1;
			break;
		}
	if(!ff) return 0;
	for(int i=1;i<=m;i++)
		if(!flag2[i]){
//			for(int j=1;j<=edgenum;j++) vet[j]=Next[j]=0;
//			edgenum=0;
//			for(int j=1;j<=n;j++) head[j]=0;
			for(int j=1;j<=n;j++) f[j]=j;
			for(int j=1;j<=m;j++)
				if(j!=i){
					int fu=find(U[j]);
					int fv=find(V[j]);
					if(fu!=fv) f[fu]=fv;
//					addedge(U[j],V[j]);
//					addedge(V[j],U[j]);
				}
			int x=0;
			for(int j=1;j<=n;j++)
				if(flag1[j]){
					x=find(j);
					break;
				}
			for(int j=1;j<=n;j++)
				if(flag1[j])
					if(find(j)!=x) return 0;
//			for(int j=1;j<=n;j++) vis[j]=0;
//			for(int j=1;j<=n;j++)
//				if(flag1[j]){
//					dfs(j);
//					break;
//				}
//			for(int j=1;j<=n;j++)
//				if(flag1[j] && !vis[j])
		}
	return 1;
}
void dfs2(int t){
	if(t>m){
		if(check()) ans++;
//		for(int i=1;i<=n;i++) printf("%d ",flag1[i]);printf("\n");
//		for(int i=1;i<=m;i++) printf("%d ",flag2[i]);printf("\n");
//		printf("%d\n",check());
		return;
	}
	flag2[t]=0;
	dfs2(t+1);
	flag2[t]=1;
	dfs2(t+1);
}
void dfs1(int t){
	if(t>n){
		dfs2(1);
		return;
	}
	flag1[t]=0;
	dfs1(t+1);
	flag1[t]=1;
	dfs1(t+1);
}
int main(){
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++) scanf("%d%d",&U[i],&V[i]);
	if(n<=16){
		dfs1(1);
		printf("%d\n",ans);
	}else{
		printf("%lld\n",(1ll*n*(n+1)/2%mod*q_pow(2ll,n-2)%mod+1ll*n*q_pow(2,n-1)%mod+n)%mod);
	}
	return 0;
}
