/*
after dusk passed,
there is a starry sky.
*/
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define m_k make_pair
#define mod 1000000007
#define int long long
#define len(a) (int)a.size()
using namespace std;
const int N=25;
int n,m,fa[N];
struct node
{
	int u,v;
}sh[N];
vector <int> e[N];
inline void add(int &a,int b){a=((a+b>=mod)?a+b-mod:a+b);}
inline void del(int &a,int b){a=((a-b<0)?a-b+mod:a-b);}
inline void mul(int &a,int b){a=a*b%mod;}
inline int m_pow(int a,int b)
{
	int ans=1;
	while (b)
	{
		if (b&1) mul(ans,a);
		b>>=1;
		mul(a,a);
	}
	return ans;
}
inline int read()
{
	int f=1,x=0;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;
}
struct dsu
{
	int fa[N];
	void init(int n)
	{
		for (int i=0;i<=n;i++) fa[i]=i;
	}
	int find(int x){return fa[x]==x?fa[x]:fa[x]=find(fa[x]);}
	void merge(int a,int b)
	{
		a=find(a);b=find(b);
		if (a==b) return;
		fa[a]=b;
	}
}T;
signed main()
{
	n=read();m=read();
	for (int i=1;i<=m;i++)
	{
		int u=read()-1,v=read()-1;
		sh[i]=(node){u,v};
	}
	int full=(1<<n)-1,ans=0,tmp=0;
	for (int mask=1;mask<=full;mask++)
	{
		int cnt=0;
		for (int i=1;i<=m;i++)
		{
			T.init(n);
			for (int j=1;j<=m;j++) if (i!=j) T.merge(sh[j].u,sh[j].v);
			int pos=0;bool bl=1;
			for (int j=0;j<n;j++) if (mask>>j&1) pos=j;
			for (int j=0;j<n;j++) if ((mask>>j&1)&&T.find(pos)!=T.find(j)) bl=0;
			if (bl) cnt++; 
		}
		add(ans,m_pow(2,cnt));
	}
	printf("%lld\n",ans);
}