#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define MAXN 500050
#define MAXM 1000100
#define MOD 1000000007
int n,m;
struct point
{
	int dfn,low;
}p[MAXN];
int all_dfn;
struct edge
{
	int v,next,belong;
}e[MAXM];
int head[MAXN];
int cnt;
void add(int u,int v)
{
	e[++cnt].v=v;
	e[cnt].next=head[u];
	head[u]=cnt;
	e[++cnt].v=u;
	e[cnt].next=head[v];
	head[v]=cnt;
}
int low_to_newp[MAXN],np_cnt;
void tj(int u,int fa)
{
	if(p[u].dfn!=0)
	{
		return;
	}
	p[u].dfn=++all_dfn;
	p[u].low=all_dfn;
	for(int i=head[u];i;i=e[i].next)
	{
		if(e[i].v==fa)
		{
			continue;
		}
		if(p[e[i].v].dfn!=0&&p[e[i].v].dfn<p[u].dfn)
		{
			p[u].low=min(p[u].low,p[e[i].v].dfn);
			continue;
		}
		tj(e[i].v,u);
		p[u].low=min(p[u].low,p[e[i].v].low);
	}
	if(p[u].dfn==p[u].low)
	{
		low_to_newp[p[u].low]=++np_cnt;
	}
}
struct newp
{
	int p_cnt,e_cnt;
}np[MAXN];
struct newe
{
	int v,next;
}ne[MAXM];
int ne_cnt;
int nh[MAXN];
void new_add(int u,int v)
{
	ne[++ne_cnt].v=v;
	ne[ne_cnt].next=nh[u];
	nh[u]=ne_cnt;
}
ll poww[MAXM];
void get_pow(int x)
{
	poww[0]=1;
	for(int i=1;i<=x;++i)
	{
		poww[i]=(poww[i-1]<<1)%MOD;
	}
}
ll f[MAXN][2];
void DFS(int now,int fa)
{
	bool flag=0;
	ll cnt1=1,cnt2=1;
	for(int i=nh[now];i;i=ne[i].next)
	{
		int v=ne[i].v;
		if(v==fa)
		{
			continue;
		}
		flag=1;
		DFS(v,now);
		cnt1=cnt1*f[v][0]*2%MOD;
		cnt2=cnt2*((f[v][1]+f[v][0]*2)%MOD)%MOD;
	}
	if(!flag)
	{
		f[now][0]=poww[np[now].e_cnt];
		f[now][1]=(poww[np[now].p_cnt]-1)*poww[np[now].e_cnt]%MOD;
	}
	else
	{
		f[now][0]=cnt1*poww[np[now].e_cnt]%MOD;
		f[now][1]=(((cnt2+MOD-cnt1)%MOD*poww[np[now].p_cnt]%MOD)*poww[np[now].e_cnt]%MOD
				  +(f[now][0]*(poww[np[now].p_cnt]-1))%MOD*poww[np[now].e_cnt]%MOD)%MOD;
	}
}
int main()
{
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1,u,v;i<=m;++i)
	{
		cin>>u>>v;
		add(u,v);
	}
	tj(1,0);
	/*for(int i=1;i<=n;++i)
	{
		cout<<p[i].dfn<<' '<<p[i].low<<endl;
	}
	for(int i=1;i<=10;++i)
	{
		cout<<low_to_newp[i]<<' ';
	}
	cout<<endl;*/
	for(int i=1;i<=n;++i)
	{
		++np[low_to_newp[p[i].low]].p_cnt;
	}
	//cout<<"A";
	for(int i=1,x,y;i<=n;++i)
	{
		for(int j=head[i];j;j=e[j].next)
		{
			x=low_to_newp[p[i].low];
			y=low_to_newp[p[e[j].v].low];
			//cout<<i<<' '<<e[j].v<<' '<<x<<' '<<y<<endl;
			if(x==y)
			{
				++np[x].e_cnt;
			}
			else
			{
				new_add(x,y);	
			}
		}
	}
	//cout<<"C";
	for(int i=1;i<=np_cnt;++i)
	{
		np[i].e_cnt/=2;
		//cout<<np[i].p_cnt<<' '<<np[i].e_cnt<<endl;
	}
	/*for(int i=1;i<=np_cnt;++i)
	{
		for(int j=nh[i];j;j=ne[j].next)
		{
			cout<<i<<" to "<<ne[j].v<<endl;
		}
	}*/
	get_pow(m);
	DFS(1,0);
	/*for(int i=1;i<=n;++i)
	{
		cout<<f[i][0]<<' '<<f[i][1]<<endl;
	}*/
	ll add_ans=0;
	for(int i=2;i<=np_cnt;++i)
	{
		add_ans=(add_ans+(poww[np[i].p_cnt]-1)*poww[np[i].e_cnt]%MOD)%MOD;
	}
	cout<<(f[1][1]+add_ans)%MOD;
}
/*
2 1
1 2
*/
/*
4 4
1 2
2 3
3 1
1 4
*/
