#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1e9+7;
int n,m,into[55],ans,fa[55];
struct Node {
	int u,v;
} init[20005];
vector<int>mp[200005];
int qpow(int x,int y) {
	if(y<0) return 0;
	int tmp=1;
	while(y) {
		if(y&1) tmp=tmp*x%mod;
		x=x*x%mod,y>>=1;
	}
	return tmp;
}
int find(int x) {
	if(fa[x]==x) return x;
	return fa[x]=find(fa[x]);
}
int Cnt[55];
void chk(int cnt) {
	for(int i=1; i<=n; ++i) fa[i]=i,Cnt[i]=0;
	for(int i=1; i<=cnt; ++i) {
		int u=init[into[i]].u,v=init[into[i]].v;
//		printf("%lld %lld\n",u,v);
		fa[u]=find(v);
	}
	for(int i=1; i<=n; ++i) {
//		printf("%lld ",find(i));
		Cnt[find(i)]++;
	}
//	puts("");
	for(int i=1; i<=n; ++i) {
		ans=(ans+qpow(2,Cnt[i])-1)%mod;
	}
}
void dfs(int now,int cnt) {
	if(now==m+1) {
		chk(cnt);
		return ;
	}
	dfs(now+1,cnt);
	into[++cnt]=now;
	dfs(now+1,cnt);
}
signed main() {
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	scanf("%lld%lld",&n,&m);
	for(int i=1; i<=m; ++i) {
		scanf("%lld%lld",&init[i].u,&init[i].v);
	}
	dfs(1,0);
	printf("%lld",ans);
	return 0;
}