#include <bits/stdc++.h>
using namespace std;
#define int long long
#define Ios ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int n,m,p,mod=1000000007,tot,tot2,h[500009],h2[500009],cnt,top,stac[500009],dfn[500009],low[500009],bel[500009],deg[500009],edg[500009],vs[500009],s[500009],ins[500009],ans,f[500009][4];
struct node
{
int to,nxt;
}e[400009],e2[400009];
void add(int u,int v)
{
e[++tot]={v,h[u]};
h[u]=tot;
}
void add2(int u,int v)
{
e2[++tot2]={v,h2[u]};
h2[u]=tot2;
}
void tarjan(int u,int fa)
{
dfn[u]=low[u]=++cnt;
stac[++top]=u;
ins[stac[top]]=1;
for(int i=h[u];i;i=e[i].nxt)
{
int v=e[i].to;
if(v==fa) continue ;
if(!dfn[v])
{
tarjan(v,u);
low[u]=min(low[u],low[v]);
}
else if(ins[v]) low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u])
{
p++;
int x;
do{
x=stac[top--];
ins[x]=0;
bel[x]=p;
vs[p]++;
}while(x!=u);
}
}
int qpow(int a,int b)
{
int res=1;
while(b)
{
if(b&1) res=(res*a)%mod;
a*=a;
a%=mod;
b=b>>1;
}
return res;
}
void dfs(int u,int fa)
{
s[u]=edg[u];
for(int i=h2[u];i;i=e2[i].nxt)
{
int v=e[i].to;
if(v==fa) continue ;
dfs(v,u);
s[u]+=s[v]+1;
}
}
void dp(int u,int fa)
{
for(int i=h2[u];i;i=e2[i].nxt)
{
int v=e2[i].to;
if(v==fa) continue ;
dp(v,u);
f[u][1]=(f[u][1]*(((f[v][0]*2)+f[v][1])%mod)%mod+f[u][0]*f[v][1]%mod)%mod;
f[u][0]=f[u][0]*((f[v][0]*2)%mod)%mod;
}
if(u==1) ans=(ans+f[u][1])%mod;
else ans=(ans+f[u][1]*qpow(2,s[1]-s[u]-1))%mod;
}
signed main()
{
Ios;
cin>>n>>m;
while(m--)
{
int x,y;
cin>>x>>y;
add(x,y);
add(y,x);
}
tarjan(1,0);
for(int x=1;x<=n;x++)
{
for(int i=h[x];i;i=e[i].nxt)
{
int v=e[i].to;
if(bel[x]!=bel[v]) add2(bel[x],bel[v]);
else edg[bel[x]]++;
}
}
for(int i=1;i<=p;i++)
{
edg[i]=edg[i]>>1;
f[i][0]=qpow(2,edg[i]);
f[i][1]=qpow(2,vs[i]+edg[i])-f[i][0];
}
dfs(1,0);
dp(1,0);
cout<<ans<<'\n';
return 0;
}