#include<bits/stdc++.h>
#define int long long
using namespace std;
int read()
{
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9')
	{
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}
const int MAXN=5e5+10,mod=1e9+7;//////////////////////////////////////
int n,m,ans,rt;
int b[MAXN],tail;
int fa[MAXN],sz[MAXN],g[MAXN],dfn[MAXN],low[MAXN],tot;
int f[MAXN][2][2],size[MAXN];
int h[MAXN],p[MAXN],L[MAXN];
int cz(int x)
{
	if(fa[x]==x)return x;
	return fa[x]=cz(fa[x]);
}
void merge(int x,int y)
{
	x=cz(x);y=cz(y);
	if(x==y)return ;
	fa[x]=y;
	sz[y]+=sz[x];
}
int ex_pow(int x,int y)
{
	int sum=1;
	while(y>0)
	{
		if(y&1)sum=sum*x%mod;
		x=x*x%mod;
		y>>=1;
	}
	return sum;
}
struct tu
{
	int cnt,u[MAXN*2],v[MAXN*2],first[MAXN],net[MAXN*2];
	void add(int x,int y)
	{
		++cnt;
		u[cnt]=x;
		v[cnt]=y;
		net[cnt]=first[x];
		first[x]=cnt;
	}
	void dfs(int x,int y)
	{
		b[++tail]=x;
		dfn[x]=low[x]=++tot;
		for(int i=first[x];i;i=net[i])
		{
			if(v[i]==y)continue;
			if(!dfn[v[i]])
			{
				dfs(v[i],x);
				low[x]=min(low[x],low[v[i]]);
			}
			else low[x]=min(low[x],dfn[v[i]]);
		}
		if(dfn[x]==low[x])
		{
			while(b[tail]!=x)
			{
				merge(x,b[tail]);
				tail--;
			}
			tail--;
		}
	}
	void dp(int x,int y)
	{
		size[x]=g[x];
		f[x][0][0]=ex_pow(2,g[x]);
		f[x][1][1]=ex_pow(2,g[x])*(ex_pow(2,sz[x])-1+mod)%mod;
	//	int t0=ex_pow(2,g[x]),t1=ex_pow(2,g[x])*(ex_pow(2,sz[x])-1+mod)%mod;
		for(int i=first[x];i;i=net[i])
		{
			if(v[i]==y)continue;
			dp(v[i],x);
			size[x]+=size[v[i]]+1;
			f[x][0][1]=(f[x][0][1]*(f[v[i]][0][0]*2+f[v[i]][0][1]+f[v[i]][1][1])%mod+f[x][0][0]*(f[v[i]][0][1]+f[v[i]][1][1])%mod)%mod;
			f[x][0][0]=f[x][0][0]*f[v[i]][0][0]%mod*2%mod;
			f[x][1][1]=f[x][1][1]*(f[v[i]][0][1]+f[v[i]][1][1]+f[v[i]][0][0]*2)%mod;
		//	f[x][0]=f[x][0]*f[v[i]][0]*2;
		//	f[x]
		//	f[x][0]=f[x][0]*f[v[i]][0]%mod*2%mod;
		//	t0=t0*(f[v[i]][0]+f[v[i]][1])%mod*2%mod;
		//	t1=t1*(f[v[i]][0]*2+f[v[i]][1])%mod;
		}
		//f[x][1]=(t1+t0-f[x][0]+mod)%mod;
//		int t0=ex_pow(2,g[x]),t1=0;
//		for(int i=first[x];i;i=net[i])
//		{
//			if(v[i]==y)continue;
//			t1=(t0*f[v[i]][1]%mod+t0*f[v[i]][1]%mod)
//			t0=t0*f[v[i]][0]%mod;
//		}
		return ;
	}
	int sl(int x,int y,int op)
	{
		p[x]=h[x];
		int sum=1;
		if(h[x])sum=(ex_pow(2,sz[x])-1)*h[x];
		for(int i=first[x];i;i=net[i])
		{
			if(v[i]==y)continue;
			sum=sum*sl(v[i],x,op)%mod;
			p[x]+=p[v[i]];
		}
		for(int i=first[x];i;i=net[i])
		{
			if(v[i]==y)continue;
			if(p[v[i]]==op||p[v[i]]==0)sum=sum*2%mod;
		}
		return sum;
	}
}e1,e2;
void sl()
{
	for(int i=1;i<=2*m;i+=2)
	{
		int x,y;
		x=e1.u[i];y=e1.v[i];
		x=cz(x);y=cz(y);
		if(x==y)g[x]++;
		else e2.add(x,y),e2.add(y,x);
	}
}
void dfs(int x,int sum)
{
	if(x==n+1)
	{
		if(sum==0)return ;
		ans+=e2.sl(rt,0,sum);
		return ;
	}
	if(cz(x)!=x)dfs(x+1,sum);
	else
	{
		h[x]=1;
		dfs(x+1,sum+1);
		h[x]=0;
		dfs(x+1,sum);
	}
	return ;
}
void baoli()
{
	dfs(1,0);
	for(int i=1;i<=n;i++)
	if(cz(i)==i)
	ans=ans*ex_pow(2,g[i])%mod;
}
signed main()
{
	freopen("barrack.in","r",stdin);freopen("barrack.out","w",stdout);
	n=read();m=read();
	for(int i=1;i<=m;i++)
	{
		int x,y;
		x=read();y=read();
		e1.add(x,y);e1.add(y,x);
	}
	for(int i=1;i<=n;i++)fa[i]=i,sz[i]=1;
	e1.dfs(1,0);
	sl();
	rt=cz(1);
	if(n<=20)
	{
		baoli();
		printf("%lld\n",ans);
		return 0;
	}
	e2.dp(rt,0);
	int o=size[rt];
	for(int i=1;i<=n;i++)
	if(cz(i)==i)
	{
		int x=i;
		ans=(ans+f[x][1][1]*ex_pow(2,o-size[x])%mod)%mod;
	}
	printf("%lld\n",ans);
	return 0;
}
