//不向抑郁与焦虑投降，这个世界终会有我们存在的地方。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<ctime>
#include<cassert>
#include<tuple>
#include<vector>
#define siz(x) int((x).size())
#define all(x) std::begin(x),std::end(x)
#define fi first
#define se second
using std::cin;using std::cout;
using std::min;using std::max;
template<typename any>inline void cmin(any &x,const any &y){if(x>y)x=y;}
template<typename any>inline void cmax(any &x,const any &y){if(x<y)x=y;}
using loli=long long;
using pii=std::pair<int,int>;
using bsi=std::basic_string<int>;
using bsc=std::string;
template<typename any>inline any get(){any x;cin>>x;return x;}
constexpr int N=5e5+1,P=1e9+7;
int n,m,ans,fa[N],sz[N];
bsi g[N];
std::vector<pii>e;
inline int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
inline int&add1(int&x,int y){return (x+=y)<P?x:x-=P;}
inline int&mul1(int&x,int y){return x=(1ll*x*y)%P;}
inline int qp(int x,int y){int z=1;for(;y;mul1(x,x),y/=2)if(y&1)mul1(z,x);return z;}
signed main(){
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	cin>>n>>m;
	for(int i=1,u,v;i<=m;i++){
		cin>>u>>v;
		g[u]+=v,g[v]+=u;
		e.emplace_back(u,v);
	}
	for(int k=0;k<(1<<m);k++){
		for(int i=1;i<=n;i++)fa[i]=i,sz[i]=1;
		for(int msk=k;msk;){
			int i=std::__lg(msk&-msk);
			int fx=find(e[i].fi),fy=find(e[i].se);
			if(fx!=fy){
				fa[fx]=fy;
				sz[fy]+=sz[fx];
			}
			msk^=(msk&-msk);
		}
		int res=0;
		for(int i=1;i<=n;i++)if(find(i)==i)
			add1(res,qp(2,sz[i])-1);
		add1(ans,res);
	}
	cout<<ans;
	return 0;
}
// AFO after NOIP2022
// 预测难度 黄蓝紫蓝??????
// 这种构造 T2 不让人活了，我练习的时候都是跳过构造的
// T3 本来靠着双联通可以打 35，太晚了！
// T4 只会 20 分的暴力
// 100+15+0+20=AFO
// 希望类比 CSP2021-S 1=是 140 分，比这个低我才有希望
// 12:49 分，晚安
// 把你的 T3 吐出来，好了，这就是你们要的结果
// 罪有应得啊，哈哈哈哈
// luogu uid:310818 不知道算不算开自己盒子
// 游记将会在：cnblogs.com/bxjz/NOIP2022 出现
// 唉没办法，要是我知道我就早点去网上搜喵了个的攻略
// 为什么不玩这个游戏????????????
// 原来开車也要开出题人喜欢的車啊
// 总司令，这题给我 5 分可好?