#include<bits/stdc++.h>
#define Lyr_ids trash
#define ccf our_red_sun
using namespace std;
typedef long long ll;
namespace IO
{
	char buf[1<<20],*iS,*iT;
	#define gh() (iS==iT?(iT=(iS=buf)+fread(buf,1,1<<20,stdin)),(iS==iT?EOF:*iS++):*iS++)
	//#define gh() getchar()
	template<typename T>
	inline void read(T &x)
	{
		x=0;
		char c=gh();
		bool sgn=0;
		while(!isdigit(c))
			sgn|=c=='-',c=gh();
		while(isdigit(c))
			x=x*10+(c^48),c=gh();
		x=sgn?-x:x;
	}
}
using namespace IO;
int n,m,ec;
const int maxn=5e5+5;
const int maxm=1e6+5;
const int mo=1e9+7;
struct Edge{
	int to,ne;
	bool vis;
}e[maxm<<1];
int he[maxn];
int sz[maxn];
ll dp[maxn][2];
void add(int x,int y)
{
	e[++ec].to=y;
	e[ec].ne=he[x];
	he[x]=ec;
}
ll qpow(int a,int p)
{
	if(p==0)
		return 1;
	if(p==1)
		return a%mo;
	if(p&1)
		return qpow(a,p^1)*a%mo;
	return qpow(a*a%mo,p>>1);
}
void dfs(int x,int fa)
{
	bool flag=0;
	sz[x]=1;
	for(int i=he[x],v;i;i=e[i].ne)
	{
		v=e[i].to;
		if(v==fa)
			continue;
		flag=1;
		dfs(v,x);
		sz[x]+=sz[v];
		dp[x][0]+=(ll)dp[v][1]+dp[v][0]<<1;
		dp[x][0]%=mo;
		dp[x][1]+=(ll)dp[v][0]+dp[v][1]+qpow(2,sz[x]-1);
		dp[x][1]%=mo;
	}
	if(flag==0)
		dp[x][1]=dp[x][0]=1;
	//dp[x][1]=1;
}
int main()
{
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	read(n),read(m);
	for(int i=1,x,y;i<=m;++i)
	{
		read(x),read(y);
		add(x,y),add(y,x);
	}
	if(m==n-1)
	{
		dfs(1,0);
		//printf("%lld %lld\n",dp[1][0],dp[1][1]);
//		for(int i=1;i<=n;++i)
//			printf("<%lld %lld>\n",dp[i][0],dp[i][1]);
		ll ans=dp[1][0]+dp[1][1]-qpow(2,m);
		((ans%=mo)+=mo)%=mo;
		printf("%lld\n",ans);
	}
	else
	{
		printf("%lld\n",19260817);
	}
	return 0;
}

