#include<bits/stdc++.h>
#define int long long
#define For(i,a,b) for(int i=(a);i<=(b);++i)
#define Rep(i,a,b) for(int i=(a);i>=(b);--i)
using namespace std;
inline int read() {
	char c=getchar();int x=0;bool f=0;
	for(;!isdigit(c);c=getchar())f^=!(c^45);
	for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+(c^48);
	if(f)x=-x; return x;
}
const int maxn=500050,maxe=1000050,mod=1e9+7;
int n,m,_a[maxe],_b[maxe];
vector<int> g[maxn];
int qpower(int a,int b)
{
	int res=1;
	while(b)
	{
		if(b&1) res=res*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return res;
}
namespace s1{
	bool fn[30],fm[30];
	int ans=0;
	vector<int> h[30];
	bool lt(int a,int b)
	{
//		cout<<a<<' '<<b<<endl;
		queue<int> que;
		bool vis[30];
		For(i,1,n) vis[i]=false;
		while(!que.empty()) que.pop();
		que.push(a);
		vis[a]=true;
		while(!que.empty())
		{
			int u=que.front();
			que.pop();
			for(int v:h[u])
			{
				if(!vis[v])
				{
					que.push(v);
					vis[v]=true;
					if(v==b) return true;
				}
			}
		}
		return false;
	}
	bool check()
	{
		bool flag=false;
		For(i,1,n)
			if(fn[i])
				flag=true;
		if(!flag) return false;
		For(e,1,m)
		{
			For(i,1,n) h[i].resize(0);
			For(i,1,m)
			{
				if(i==e&&!fm[i]) continue;
				h[_a[i]].push_back(_b[i]);
				h[_b[i]].push_back(_a[i]);
			}
			For(i,1,n)
			{
				if(!fn[i]) continue;
				For(j,i+1,n)
				{
					if(!fn[j]) continue;
					if(!lt(i,j)) return false;
				}
			}
		}
//		cout<<fn[1]<<' '<<fn[2]<<' '<<fm[1]<<' '<<fm[2]<<endl;
		return true;
	}
	void dfs2(int pm)
	{
		if(pm>m)
		{
			if(check()) ans++;
			return;
		}
		fm[pm]=true;
		dfs2(pm+1);
		fm[pm]=false;
		dfs2(pm+1);
	}
	void dfs1(int pn)
	{
		if(pn>n)
		{
			dfs2(1);
			return;
		}
		fn[pn]=true;
		dfs1(pn+1);
		fn[pn]=false;
		dfs1(pn+1);
	}
	int solve()
	{
		ans=0;
		dfs1(1);
		return ans;
	}
}
namespace s4{
	bool check()
	{
		if(m!=n-1) return false;
		For(i,1,n) if(g[i].size()>2) return false;
		return true;
	}
	int solve()
	{
		return (n*qpower(2,m)%mod+qpower(2,m-1)*((m+1)*m/2)%mod)%mod;
	}
}
signed main()
{
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	n=read(); m=read();
	For(i,1,m)
	{
		int a=read(),b=read();
		_a[i]=a,_b[i]=b;
		g[a].push_back(b);
		g[b].push_back(a);
	}
	if(s4::check())
	{
		cout<<s4::solve()<<endl;
		return 0;
	}
	cout<<s1::solve()<<endl;
	return 0;
}