#include <bits/stdc++.h>
#define int long long
#define For(i, a, b) for (int i = (a); i <= (b); i ++)
#define foR(i, a, b) for (int i = (a); i >= (b); i --)
using namespace std;
int n, m, k, num;
int ans, cnt, sum;
int b[2000005], dfn[500005], low[500005], P[1000005];
int bel[500005], e[500005], v[500005], sz[500005];
int pre[500005], pre_[500005];
int f[500005][2];
map <pair <int, int>, bool> mp;
const int mod = 1000000007;
struct Node {int u, v, nxt, num;}a[2000005],a_[2000005];
void add (int u, int v) {
a[++ k] = {u, v, pre[u], num};
pre[u] = k;
}
void add_ (int u, int v) {
a_[++ k] = {u, v, pre_[u], num};
pre_[u] = k;
}
void tarjan (int u, int fe) {
dfn[u] = low[u] = ++ cnt;
for (int i = pre[u]; i; i = a[i].nxt) {
if (a[i].num == fe) continue;
int v = a[i].v;
if (!dfn[v]) {
tarjan (v, a[i].num);
if (dfn[u] < low[v]) b[a[i].num] = 1;
low[u] = min (low[u], low[v]);
} else low[u] = min (low[u], dfn[v]);
}
}
void dfs (int u, int c) {
++ v[c];
bel[u] = c;
for (int i = pre[u]; i; i = a[i].nxt) {
int v = a[i].v;
if (bel[v] || b[a[i].num]) continue;
dfs (v, c);
}
}
int predfs (int u, int fa) {
sz[u] = e[u];
f[u][0] = P[e[u]];
f[u][1] = (P[e[u] + v[u] ] - P[e[u] ] + mod) % mod;
for (int i = pre_[u]; i; i = a_[i].nxt) {
int v = a_[i].v;
if (v == fa) continue;
predfs (v, u);
sz[u] += sz[v] + 1;
}
}
void dfs_ans (int u, int fa) {
for (int i = pre_[u]; i; i = a_[i].nxt) {
int v = a_[i].v;
if (v == fa) continue;
dfs_ans (v, u);
f[u][1] = (f[u][1] * ((f[v][0] << 1) + f[v][1]) % mod + f[u][0] * f[v][1] % mod) % mod;
f[u][0] = (f[u][0] * (f[v][0] << 1)) % mod;
}
if (u == 1) ans += f[u][1];
else ans += f[u][1] * P[sz[1] - sz[u] - 1];
ans %= mod;
}
void solve () {
P[0] = 1;
For (i, 1, 1000000) P[i] = P[i - 1] * 2 % mod;
scanf ("%lld%lld", &n, &m);
For (i, 1, m) {
int u, v;
scanf ("%lld%lld", &u, &v);
++ num;
add (u, v);
add (v, u);
}
For (i, 1, n) if (!dfn[i]) tarjan (i, 0);
For (i, 1, n) if (!bel[i]) dfs (i, ++ sum);
For (i, 1, k) {
if (i % 2 == 0) continue;
if (bel[a[i].u] == bel[a[i].v]) ++ e[bel[a[i].u]];
else if (!mp[make_pair (bel[a[i].u], bel[a[i].v])]){
mp[make_pair (bel[a[i].u], bel[a[i].v])] = 1;
mp[make_pair (bel[a[i].v], bel[a[i].u])] = 1;
add_(bel[a[i].u],bel[a[i].v]);
add_(bel[a[i].v],bel[a[i].u]);
}
}
predfs (1, 0);
dfs_ans (1, 0);
cout << ans;
}
signed main () {
ios :: sync_with_stdio (false);
int _ = 1;
while (_ --) {
solve ();
cout << '\n';
}
return 0;
}