#include <stdio.h>
#include <algorithm>
#include <set>
#include <string.h>
#include <vector>
#define int long long
int read()
{
    int x=0,f=1,c=getchar();
    while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
    while(c>47&&c<58)x=x*10+c-48,c=getchar();
    return x*f;
}
int re1d()
{
    int c=getchar();
    while(c<48||c>57)c=getchar();
    return c-48;
}
const int mod=1e9+7;
int ae(int x,int y){int z=x+y;if(z>=mod)z-=mod;return z;}
int me(int x,int y){return x*y%mod;}
std::vector<std::pair<int,int> >g[1000005];
std::vector<int> G[1000005];
typedef int arr[1000005];
arr dfn,low,cut;
using std::min;
using std::max;
int cc;
void dfs(int u,int fa)
{
    dfn[u]=low[u]=++cc;
    for(std::pair<int,int> aaa:g[u])
    {
        int v=aaa.first,id=aaa.second;
        if(dfn[v])
        {
            if(v!=fa)low[u]=min(low[u],dfn[v]);
        }
        else 
        {
            dfs(v,u),low[u]=min(low[u],low[v]);
            if(low[v]>dfn[u])cut[id]=1;
        }
    }
}
arr x,y;
arr f,sz1,sz2,p2;
int ff(int x)
{
    return x==f[x]?x:f[x]=ff(f[x]);
}
int dp[1000005][2][2];
//  u edge choose
int z=0;
void dfs2(int u,int fa)
{
    // int a0=0,e=0,c=0,ec=0;
    int &e=dp[u][1][0];
    int &c=dp[u][0][1];
    int &ec=dp[u][1][1];

    e=1;
    ec=ae(p2[sz1[u]],mod-1);
    int tmp=1;
    // ec=p2[sz1[u]];
    c=0;
    for(int v:G[u])
    {
        if(v==fa)continue;
        dfs2(v,u);
        c=ae(me(c,dp[v][1][0]*2%mod),me(e,dp[v][0][1]%mod));
        ec=ae(me(ec,dp[v][1][1]),ae(me(ec,dp[v][1][0]*2%mod),me(e,dp[v][1][1])));
        tmp=ae(me(tmp,dp[v][1][1]),ae(me(tmp,dp[v][1][0]*2%mod),me(0,dp[v][1][1])));
        e=me(e,dp[v][1][0]*2%mod);
        
    }
    c=ae(c,c);
    c=ae(c,ec);
    // c=ae(c,mod-e);
    z=ae(z,ec);
    // int r=u;    printf("%lld %lld %lld %lld\n",sz1[u],dp[r][1][0],dp[r][0][1],dp[r][1][1]);
}
signed main()
{
    freopen("barrack.in","r",stdin);
    freopen("barrack.out","w",stdout);
    int n=read(),m=read();
    p2[0]=1;
    for(int i=1;i<=1000000;i++)p2[i]=ae(p2[i-1],p2[i-1]);
    for(int i=1;i<=m;i++)
    {
        int u=read(),v=read();
        g[u].push_back(std::make_pair(v,i));
        g[v].push_back(std::make_pair(u,i));
        x[i]=u,y[i]=v;
    }
    for(int i=1;i<=n;i++)f[i]=i,sz1[i]=1;
    dfs(1,0);
    int ns=1;
    for(int i=1;i<=m;i++)
    {
        if(!cut[i])
        {
            int u=ff(x[i]),v=ff(y[i]);
            if(u!=v)
            {
                f[u]=v,sz1[v]+=sz1[u];
            }
            ns=ae(ns,ns);
        }
    }
    int cnt=1;
    for(int i=1;i<=m;i++)
        if(cut[i])
            G[ff(x[i])].push_back(ff(y[i])),
            G[ff(y[i])].push_back(ff(x[i])),cnt++;
    // printf("%d\n",cnt);
    dfs2(ff(1),0);
    int r=ff(1);
    // printf("%lld %lld %lld\n",dp[r][1][0],dp[r][0][1],dp[r][1][1]);
    // printf("%lld\n",me(ns,dp[r][1][1]));
    // printf("%lld\n",me(ns,dp[r][0][1]));
    int wtf=ae(dp[r][1][1],dp[r][0][1]);
    wtf=me(wtf,mod+1>>1);
    printf("%lld\n",wtf*ns%mod);
}