#include<bits/stdc++.h>
using namespace std;

struct node{
	int u,v;
	int to;
}edge[1000005];
int cnt=0,head[500005];

int n,m;

void add(int u,int v)
{
	edge[++cnt].u=u;
	edge[cnt].v=v;
	edge[cnt].to=head[u];
	head[u]=cnt;
}

bool ok1011()
{
	for(int i=1;i<n;i++)
	{
		bool b=0;
		for(int j=head[i];j!=0;j=edge[j].to)
		{
			if(edge[j].v==edge[j].u+1)
			{
				b=1;
				continue;
			}
		}
//		printf("line%d:ok",i);
		if(b==0)return 0;
	}
	return 1;
}

long long quickpow1011(int k)
{
	if(k==0)return 1;
	if(k==1)return 2;
	if(k&1==1)
	{
		long long tmp=quickpow1011(k/2)%(1000000000+7);
		return ((2*tmp)%(1000000000+7))*tmp%(1000000000+7);
	}
	else
	{
		long long tmp=quickpow1011(k/2)%(1000000000+7);
		return tmp*tmp%(1000000000+7);
	}
}


int main()
{
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		int tu,tv;
		scanf("%d%d",&tu,&tv);
		add(tu,tv);
		add(tv,tu);
	}
	if(m==n-1)
	{
//		for(int i=1;i<=m*2;i++)
//		{
//			printf("%d %d %d\n",edge[i].to,edge[i].u,edge[i].v);
//		}
//		for(int i=1;i<=n;i++)
//		{
//			printf("%d\n",head[i]);
//		}
//		printf("%d",ok1011());
		if(ok1011()==1)
		{
			int db=quickpow1011(m-1)*(long long)(m+1)*m/2%(1000000000+7);
			int bb=(long long)n*quickpow1011(m)%(1000000000+7);
			printf("%lld",(db+bb)%(1000000000+7));
		}
		else
		{
			int db=quickpow1011(m-1)*(long long)(m+1)*m/2%(1000000000+7);
			int bb=(long long)n*quickpow1011(m)%(1000000000+7);
			printf("%lld",(db+bb)%(1000000000+7));
		}
	}
	
	return 0;
}