//I love Keqing forever!
#include<bits/stdc++.h>
#define int long long
const int mod=1e9+7;
using namespace std;
int n,m;
namespace subtask1
{
	int x[51],y[51],on[51],ans=0;
	int vis[51];
	int fa[51],sz[51];
	int f[51][51][51];//if choose x,y must choose z
	int get(int x)
	{
		return x==fa[x]?x:fa[x]=get(fa[x]);
	}
	void check()
	{
		int mask[51]={};
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				if(on[i]&&on[j])
				{
					for(int k=1;k<=m;k++)
						mask[k]|=f[i][j][k];
				}
		int sum=0;
		for(int i=1;i<=m;i++)
			sum+=mask[i]==0;
		ans=(ans+(1ll<<sum))%mod;
	}
	void dfs(int x)
	{
		if(x==n+1)
		{
			check();
			return ;
		}
		on[x]=1;
		dfs(x+1);
		on[x]=0;
		dfs(x+1);
	}
	void solve()
	{
		for(int i=1;i<=m;i++)
			scanf("%lld%lld",&x[i],&y[i]);
		for(int i=1;i<=m;i++)
		{
			for(int j=1;j<=n;j++)
				fa[j]=j;
			for(int j=1;j<=m;j++)
			{
				if(i!=j)
					fa[get(x[j])]=get(y[j]);
			}
			for(int j=1;j<=n;j++)
				for(int k=1;k<=n;k++)
					if(get(j)!=get(k))
						f[j][k][i]=1;
		}
		dfs(1);
		printf("%lld\n",(ans-(1<<m)+mod)%mod);
	}
};
namespace subtask2
{
	int f[500010],g[500010];
	int qsm(int x,int y)
	{
		int res=1;
		while(y)
		{
			if(y&1)
				res=res*x%mod;
			x=x*x%mod;
			y>>=1;
		}
		return res;
	}
	void solve()
	{
		int ans=0;
		for(int i=0;i<n;i++)
			ans=(ans+(n-i)*qsm(2,n-1-i)%mod*(i==0?1:qsm(2,i-1)))%mod;
		printf("%lld\n",ans);
	}
};
signed main()
{
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	scanf("%lld%lld",&n,&m);
	if(n<=16&&m<=25)
	{
		subtask1::solve();
		return 0;
	}
	if(m+1==n)
	{
		subtask2::solve();
		return 0;
	}
}
//Beaten by sunzh
