#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define pb push_back
const int N=5e5+10,mod=1e9+7,M=100;
int n,m,ans,a[4000000],cnt,u[M],v[M],vis[M],lt[M],xh,siz[M];
inline int read()
{
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-')
			f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
}
vector<int> g[N];
int qpow(int a,int b)
{
	int sum=1;
	while(b)
	{
		if(b&1)
			sum=sum*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return sum;
}
void gz(int x,int ws)
{
	if(ws==m)
	{
		a[++cnt]=x;
		return ;
	}
	gz((x<<1)+1,ws+1);
	gz((x<<1),ws+1);
}
void jt()
{
	for(int i=1;i<=n;i++)
	{
		g[i].clear();
	}
	for(int i=1;i<=m;i++)
	{
		if(vis[i])
		{
			g[u[i]].pb(v[i]);
			g[v[i]].pb(u[i]);
		}
	}
}
void dfs(int x)
{
	lt[x]=xh;
	siz[xh]++;
	for(auto v:g[x])
	{
		if(!lt[v])
			dfs(v);
	}
}
signed main()
{
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	n=read(),m=read();
	for(int i=1;i<=m;i++)
	{
		u[i]=read(),v[i]=read();
	}
	if(m>25)
	{
		cout<<114514;
		return 0;
	}
	gz(0,0);
	for(int i=1;i<=cnt;i++)
	{
		memset(vis,0,sizeof(vis));
		memset(lt,0,sizeof(lt));
		memset(siz,0,sizeof(siz));
		int p=a[i],k=1;
		xh=0;
		while(p)
		{
			if(p&1)
				vis[k]=1;
			k++;
			p>>=1;
		}
		jt();
		for(int j=1;j<=n;j++)
		{
			if(!lt[j])
			{
				xh++;
				dfs(j);
			}
		}
		for(int j=1;j<=xh;j++)
		{
			ans=(ans+qpow(2,siz[j])-1)%mod;
		}
	}
	cout<<ans;
	return 0;
}
/*
4 4 
1 2
2 3
3 1
1 4
*/
