#include <bits/stdc++.h>
#define rep(i, l, r) for(int i=l, _=r; i<=_; ++i)
typedef long long ll;
inline int read() {
	int res=0; char ch; bool k=1;
	while(!isdigit(ch=getchar())) k=ch^'-';
	do res=res*10+(ch^48); while(isdigit(ch=getchar()));
	return k? res: -res;
}
const int mN=1e6+9, mod=1e9+7, inv2=5e8+4;
inline int qpow(int x, int y) {
	int res=1;
	for(; y; y>>=1, x=(ll) x*x%mod) if(y&1) res=(ll) res*x%mod;
	return res;
}
inline void to_min(int &x, const int y) {
	if(x>y) x=y;
}
bool Mbe;
int n, m;

struct Graph {
	int oe, head[mN], e[mN*2][2];
	inline void add(const int x, const int y) {
		e[++oe][0]=head[x], e[head[x]=oe][1]=y;
	}
#define lfor(G, t, y, x) for(int t=G.head[x], y; y=G.e[t][1], t; t=G.e[t][0])
} G, tr;

int oc, col[mN], cnt[mN];
int sta[mN], top;
int dfn_cl, dfn[mN], low[mN];
void tarjan(int x, int f) {
	low[x]=dfn[x]=++dfn_cl;
	sta[++top]=x;
	lfor(G, t, y, x) if(y!=f) {
		if(dfn[y]) to_min(low[x], low[y]);
		else {
			tarjan(y, x);
			to_min(low[x], low[y]);
		}
	}
	if(low[x]==dfn[x]) {
		++oc;
		do col[sta[top]]=oc, ++cnt[oc]; while(sta[top--]!=x);
	}
}

int ans;
int dp[mN][2];
void dfs(int x, int f) {
//	int siz=0;
	lfor(tr, t, y, x) if(y!=f) {
		dfs(y, x);
		int dpy=(ll) dp[y][1]*inv2%mod;
		dp[x][1]=(dp[x][1]+(ll) (dp[x][1]+dp[x][0])*dpy)%mod;
		dp[x][0]=(dp[x][0]+dpy)%mod;
//		++siz;
	}
//	assert(siz<=1);
//	printf("dp[%d][0] = %lld, dp[%d][1] = %lld\n",
//	x, (ll) dp[x][0]*qpow(2, m)%mod, x, (ll) dp[x][1]*qpow(2, m)%mod);
	dp[x][1]=(dp[x][1]+(ll) (dp[x][1]+dp[x][0]+1)*(qpow(2, cnt[x])-1))%mod;
//	printf("dp[%d] = %lld\n", x, (ll) dp[x][1]*qpow(2, m)%mod);
	ans=(ans+dp[x][1])%mod;
	dp[x][1]=(dp[x][1]+dp[x][0])%mod;
}

bool Men;
int main() {
	freopen("barrack.in", "r", stdin);
	freopen("barrack.out", "w", stdout);

//	std::cerr<<"memory: "<<(&Mbe-&Men>>20)<<" MB\n";

	n=read(), m=read();
	rep(__, 1, m) {
		int x=read(), y=read();
		G.add(x, y), G.add(y, x);
	}
	tarjan(1, 0);
//	rep(i, 1, n) printf("col %d = %d\n", i, col[i]);
//	rep(i, 1, oc) printf("cnt %d = %d\n", i, cnt[i]);
//	int cnt=0;
	rep(x, 1, n) {
		lfor(G, t, y, x) if(col[x]!=col[y]) {
			tr.add(col[x], col[y]);
//			++cnt;
//			printf("tr %d %d\n", col[x], col[y]);
		}
	}
//	assert(cnt==oc*2-2);
	dfs(1, 0);
//	std::cerr<<"oc = "<<oc<<"\n";
	ans=(ll) ans*qpow(2, m)%mod;
	printf("%d\n", ans);
	return 0;
}
/*
13+23+9
da yh li qr ui lm/baojin

ll zu ts gz
8 7
1 2
1 3
1 4
1 5
1 6
4 7
4 8

8 7
1 2
2 3
2 4
3 5
3 6
3 7
3 8

*/