#include<bits/stdc++.h>
using namespace std;
const int mod = 1e9+7;
const int N = 5e5+10;
const int M = 1e6+10;
int n,m;
namespace st1{
long long ans;
int b[N];
int f[N];
vector<int> e[N];
struct node{
int u,v;
}uv[N<<1];
int find(int x){
return f[x]==x?x:f[x]=find(f[x]);
}
void work(int cnt){
int res = 0;
for(int i = 1;i<=m;++i){
bool flag = 1;
for(int j = 1;j<=n;++j){
f[j] = j;
}
for(int j = 1;j<=m;++j){
if(j==i)continue;
int fx = find(uv[j].u),fy = find(uv[j].v);
if(fx==fy)continue;
f[fx] = fy;
}
for(int j = 2;j<=cnt;++j){
if(find(b[j])!=find(b[j-1])){
flag = 0;
break;
}
}
if(flag)++res;
}
ans+=(1ll<<res)%mod;
ans%=mod;
}
void dfs(int now,int cnt){
if(cnt)work(cnt);
if(now==n||cnt==n)return ;
for(int i = now+1;i<=n;++i){
b[cnt+1]=i;
dfs(i,cnt+1);
}
}
void solve(){
for(int i = 1;i<=m;++i){
int u,v;
scanf("%d%d",&u,&v);
uv[i].u = u;
uv[i].v = v;
e[u].push_back(v);
e[v].push_back(u);
}
dfs(0,0);
printf("%lld",ans);
}
}
namespace st2{
int head[N],nxt[M<<1],to[M<<1],tot = 1;
int dfn[N],low[N],cnt,sum,vis[N],is[N];
long long dp[N][2],lg[M];
vector<int> e[N];
int siz[N],vis2[N],esz[N];
void add(int x,int y){
nxt[++tot] = head[x];
to[tot] = y;
head[x] = tot;
}
void tarjan(int u,int from){
dfn[u]=low[u] = ++cnt;
for(int i = head[u];i;i=nxt[i]){
int v = to[i];
if(!dfn[v]){
tarjan(v,i);
if(low[v]>dfn[u]){
is[i] = is[i^1] = 1;
}
low[u] = min(low[u],low[v]);
}else if(i!=(1^from)){
low[u] = min(low[u],dfn[v]);
}
}
}
void dfs(int u,int id){
siz[id]++;
vis[u] = id;
for(int i = head[u];i;i=nxt[i]){
int v = to[i];
if(vis[v]||is[i])continue;
dfs(v,id);
}
}
void build(int u,int fa){
vis2[u] = 1;
for(int i = head[u];i;i=nxt[i]){
int v=to[i];
if(vis2[v]){
continue;
}
if(is[i]){
e[vis[u]].push_back(vis[v]);
}
build(v,u);
}
}
void init(){
lg[0]=1;
for(int i = 1;i<M;++i){
lg[i] = lg[i-1]*2%mod;
}
}
void dfs2(int u){
for(int v:e[u]){
dfs2(v);
esz[u]+=esz[v]+1;
}
}
void work(int u){
dp[u][1]=1;
for(int v:e[u]){
work(v);
dp[u][1]=dp[u][1]*(dp[v][1]+lg[esz[v]+1])%mod;
dp[u][0]+=dp[v][1]*lg[esz[u]-esz[v]-1]%mod-dp[v][0]*lg[esz[u]-esz[v]]%mod;
dp[u][0]%=mod;
}
dp[u][1]=(dp[u][1]*lg[siz[u]]%mod-lg[esz[u]])%mod;
dp[u][0]=(dp[u][1]-dp[u][0])%mod;
}
void solve(){
for(int i = 1;i<=m;++i){
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
tarjan(1,0);
for(int i = 1;i<=n;++i){
if(!vis[i]){
dfs(i,++sum);
continue;
}
}
build(1,0);
init();
dfs2(1);
work(1);
long long ans = (dp[1][0]%mod+mod)%mod;
ans*=lg[m-sum+1];
ans%=mod;
printf("%lld",ans);
}
}
int main(){
scanf("%d%d",&n,&m);
if(n<=16&&m<=25){
st1::solve();
}else{
st2::solve();
}
return 0;
}