#include<bits/stdc++.h>
#define int long long
using namespace std;
int const N=500010,M=2000010,MOD=1000000007;
int n,m,pw[N];
vector<pair<int,int> >gg;
namespace solve0{
	int f[23];
	int find(int x){
		return x^f[x]?f[x]=find(f[x]):x;
	}
	int merge(int x,int y){
		int fx=find(x),fy=find(y);
		return fx^fy?(f[fx]=fy,1):0;
	}
	void solve15pts(){
		int cnt=0;
		for(int i=1;i<1<<n;i++)
			for(int j=0;j<1<<m;j++){
				int flg=1;
				vector<int>w;
				for(int p=1;p<=n;p++)
					if(i>>(p-1)&1)
						w.push_back(p);
				int ct=w.size();
				for(int t=0;t<m&&flg;t++)
					if(~j>>t&1){
						for(int p=1;p<=n;p++)
							f[p]=p;
						for(int p=0;p<m;p++)
							if(p^t)
								merge(gg[p].first,gg[p].second);
						for(int i=1;i<ct;i++)
							flg&=find(w[0])==find(w[i]);
					}
				cnt+=flg;
			}
		cout<<cnt<<"\n";
	}
}
//namespace solve1{
//	int ans,sz[N],pw[N],f[N];
//	void dfs(int x,int fa){
//		sz[x]=1;
//		for(int y:e[x]){
//			if(y==fa)
//				continue;
//			dfs(y,x),sz[x]+=sz[y];
//		}
//		int res1=1;
//		for(int y:e[x])
//			if(y!=fa)
//				res1=res1*(pw[sz[y]]+f[y])%MOD;
//		int res2=res1-1;
//		for(int y:e[x])
//			if(y!=fa)
//				res2=(res2-pw[sz[y]]-f[y])%MOD;
//		res2=res2*500000004%MOD;
//		if(e[x].size()-!!fa==1)
//			res2=0;
//		f[x]=(res1+res2+MOD)%MOD;
//		ans=(ans+f[x]*pw[n-sz[x]]%MOD)%MOD;
//		cerr<<x<<" "<<res1<<" "<<res2<<" "<<ans<<"\n";
//	}
//	void solve25pts(){
//		for(int i=0;i<N;i++)
//			pw[i]=i?pw[i-1]*2%MOD:1;
//		for(int x,y,i=1;i<n;i++){
//			cin>>x>>y;
//			e[x].push_back(y);
//			e[y].push_back(x);
//		}
//		dfs(1,0);
//		cout<<ans<<"\n";
//	}
//}
namespace solve2{
	int ans,tot=1,cnt,cur,sz[N],f[N],bcc[N],g[N],
		hd[N],nxt[M],to[M],dfn[N],low[N],vis[M],ce[N];
	stack<int>s;
	vector<pair<int,int> >e[N];
	map<pair<int,int>,int>cew;
	void add_edge(int x,int y){
		nxt[++tot]=hd[x],to[tot]=y,hd[x]=tot;
	}
	void tarjan(int x){
		dfn[x]=low[x]=++cur,s.push(x);
		for(int i=hd[x];i;i=nxt[i]){
			int y=to[i];
			if(vis[i])
				continue;
			vis[i]=vis[i^1]=1;
			if(!dfn[y])
				tarjan(y),low[x]=min(low[x],low[y]);
			else
				low[x]=min(low[x],dfn[y]);
		}
		if(dfn[x]==low[x])
			for(cnt++;;){
				int t=s.top();s.pop();
				bcc[t]=cnt,sz[cnt]++;
				if(t==x)break;
			}
	}
	void dfs(int x,int fa){
		int w=(pw[sz[x]]-1)*pw[ce[x]]%MOD;
		for(auto i:e[x]){
			int y=i.first,k=i.second;
			if(y==fa)
				continue;
			dfs(y,x),sz[x]+=sz[y],ce[x]+=ce[y]+k;
		}
		int res1=1,s=0;
		for(auto i:e[x]){
			int y=i.first,k=i.second;
			if(y!=fa)
				res1=res1*(pw[ce[y]+k]+g[y])%MOD,
				s=(s+f[y])%MOD;
		}
		int res2=0;
		for(auto i:e[x]){
			int y=i.first;
			if(y!=fa)
				res2=(res2+s*g[y]%MOD);
		}
		res2=res2*500000004%MOD;
		if(e[x].size()-!!fa<2)
			res2=0;
		g[x]=res1*(w+pw[ce[x]])%MOD;
		f[x]=((res1+res2)%MOD*w%MOD+MOD)%MOD;
		ans=(ans+f[x]*pw[m-ce[x]]%MOD)%MOD;
//		cerr<<x<<" "<<f[x]<<" "<<ans<<"\n";
	}
	void solve_pts(){
		for(int i=0;i<N;i++)
			pw[i]=i?pw[i-1]*2%MOD:1;
		for(int x,y,i=m;i--;)
			cin>>x>>y,add_edge(x,y),add_edge(y,x);
		for(int i=1;i<=n;i++)
			if(!dfn[i])
				tarjan(i);
		for(int i=1;i<=n;i++)
			for(int j=hd[i];j;j=nxt[j])
				if(bcc[i]^bcc[to[j]])
					cew[{bcc[i],bcc[to[j]]}]++;
				else
					ce[bcc[i]]++;
		for(auto i:cew){
			int x=i.first.first,y=i.first.second;
			e[x].push_back({y,i.second});
		}
		for(int i=1;i<=cnt;i++)
			ce[i]/=2;
//		cerr<<cnt<<"\n";
//		for(int i=1;i<=cnt;i++)
//			cerr<<sz[i]<<" "<<ce[i]<<"\n";
//		for(int i=1;i<=cnt;i++)
//			for(auto j:e[i])
//				if(j.first<i)
//					cerr<<i<<' '<<j.first<<"\n";
		dfs(1,0);
		cout<<(ans%MOD+MOD)%MOD<<"\n";
	}
}
namespace solve3{
	int check(){
		int flg=m==n-1;
		for(int i=0;i<m;i++)
			flg&=gg[i].first==i+1&&gg[i].second==i+2;
		return flg;
	}
	void solve10pts(){
		for(int i=0;i<N;i++)
			pw[i]=i?pw[i-1]*2%MOD:1;
		int res=0;
		for(int i=1;i<=n;i++)
			res=(res+pw[n-i]*(n-i+1)%MOD*pw[max(i-2,0ll)])%MOD;
		cout<<res<<"\n";
	}
}
signed main(){
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	ios::sync_with_stdio(0);
	cin>>n>>m;
	for(int x,y,i=m;i--;)
		cin>>x>>y,gg.push_back({x,y});
	if(n<=8&&m<=10)
		solve0::solve15pts();
	else
	if(solve3::check())
		solve3::solve10pts();
	else
//	if(m<n)
//		solve1::solve25pts();
//	else
		solve2::solve_pts();
}
