#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+100,M=1e6+100,mod=1e9+7;
int head[N],tot;
struct Edge{int to,nxt;}e[M<<1];
void Add(int x,int y){e[++tot]={y,head[x]};head[x]=tot;}
void add(int x,int y){Add(x,y);Add(y,x);}
int n,m;
int dfn[N],low[N],cut[M],num;
void tarjan(int x,int id)
{
    dfn[x]=low[x]=++num;
    for(int i=head[x];i;i=e[i].nxt)
    {
        if((i==id)||(i==(id^1)))continue;
        int y=e[i].to;
        if(!dfn[y])
        {
            tarjan(y,i);
            low[x]=min(low[x],low[y]);
            if(low[y]>dfn[x])cut[i]=cut[i^1]=1;
        }
        else low[x]=min(low[x],dfn[y]);
    } 
}   
int bel,col[N];
int sizp[N];
void dfsp(int x)
{
    col[x]=bel;sizp[bel]++;
    for(int i=head[x];i;i=e[i].nxt)
    {
        int y=e[i].to;
        if(!cut[i]&&!col[y])dfsp(y);
    }
}
vector<int>g[N];
int dp[N][4],p[M];
/*
dp[x][0] 表示 x 子树内没有点的方案数
dp[x][1] 表示下面的子树有点但是 x 没有点，不与 x 联通的方案数
dp[x][2] 表示x 内有点且都与 x 联通的方案书
dp[x][3] 表示 x 没有点，x 子树内有点，且联通的方案数
*/
void dfs(int x,int fa)
{
	dp[x][0]=1;
	dp[x][1]=0;
	dp[x][2]=(p[sizp[x]]-1);
	dp[x][3]=0;
    for(auto y:g[x])
    {
        if(y==fa)continue;
        dfs(y,x);
        dp[x][3]=((dp[y][2]+dp[y][3])*dp[x][0]%mod+
				(dp[y][0]*2+dp[y][2]+dp[y][3])*dp[x][3])%mod;
        dp[x][1]=((dp[y][1]*2+dp[y][2]+dp[y][3])%mod*dp[x][0]+
				 (dp[y][0])*2%mod*dp[x][1])%mod;
        dp[x][2]=(dp[y][0]*2+dp[y][2]+dp[y][3])%mod*dp[x][2]%mod;
        dp[x][0]=dp[x][0]*dp[y][0]%mod*2%mod;
    }
}
signed main()
{
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
    tot=1;
    p[0]=1;
    for(int i=1;i<M;i++)p[i]=p[i-1]*2%mod;
    scanf("%lld%lld",&n,&m);
    for(int i=1,x,y;i<=m;i++)
        scanf("%lld%lld",&x,&y),add(x,y);
    for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i,0);
    for(int i=1;i<=n;i++)if(!col[i])bel++,dfsp(i);
    for(int x=1;x<=n;x++)
        for(int i=head[x];i;i=e[i].nxt)
        {
            int y=e[i].to;
            if(col[x]!=col[y])g[col[x]].push_back(col[y]);
        }
//    return 0;
    dfs(1,0);
    int ans=((dp[1][1]+dp[1][2]+dp[1][3])%mod+mod)%mod;
    printf("%lld\n",ans*p[m-(bel-1)]%mod);
    return 0;
}