#include<bits/stdc++.h>
using namespace std;
const long long MOD=1000000007;
long long ans,jian[3011],bujian[3011],er[5011],dian[3011],bian[3011];
int n,m,k,mm,ss[5011],u[5011],v[5011],qltt[3011],qlt[3011],l,U,V,p[5011],xz[5011],a[3011][3011],b[3011][3011];
int bi[3011][3011];
int dfs(int x,int l,int fr)
{
	if(p[x]) return 0;
	if(x==l) return qltt[x];
	p[x]=1;
	for(int i=1;i<=n;i++) if(a[i][x]&&i!=fr) qltt[x]=dfs(i,l,x);
	p[x]=0;
	return qltt[x];
}
void pd(long long s)
{
	int t=false;
	for(int i=1;i<=k&&!t;i++) if(xz[i]) t=true;
	if(!t) return ;
	long long anss=0;
	for(int i=1;i<=mm;i++) ss[i]=1;
	for(int i=1;i<k;i++)
		for(int j=i+1;j<=k;j++)
			if(xz[i]&&xz[j])
				for(int p=1;p<=mm;p++)
					if(bi[p][i]!=bi[p][j]) ss[p]=0;
	for(int i=1;i<=mm;i++) anss+=ss[i];
	ans=(ans+s*er[anss])%MOD;
}
void dfss(int l,long long s)
{
	if(l>k) pd(s);
	else
	{
		xz[l]=1;
		dfss(l+1,s*jian[l]%MOD);
		xz[l]=0;
		dfss(l+1,s*bujian[l]%MOD);
	}
}
void sb(int x,int j,int p)
{
	bi[p][x]=1;
	for(int i=1;i<=k;i++) if(b[x][i]&&i!=j) sb(i,x,p);
}
int main()
{
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	scanf("%d%d",&n,&m);
	er[0]=1;
	er[1]=2;
	for(int i=2;i<=m;i++) er[i]=er[i-1]*2%MOD;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&U,&V);
		a[U][V]=a[V][U]=1;
	}
	for(int i=1;i<=n;i++)
	{
		if(qlt[i]) continue;
		qltt[i]=++k;
		for(int j=1;j<=n;j++) if(a[i][j]) l=dfs(j,i,i);
		for(int i=1;i<=n;i++) if(qltt[i]) qlt[i]=qltt[i],qltt[i]=0;
		p[i]=0;
	}
	for(int i=1;i<=n;i++)
	{
		dian[qlt[i]]++;
		for(int j=1;j<=n;j++)
			if(a[i][j])
			{
				if(qlt[i]==qlt[j]) bian[qlt[i]]++; 
				else if(b[qlt[i]][qlt[j]]==0) b[qlt[i]][qlt[j]]=b[qlt[j]][qlt[i]]=1,u[++mm]=qlt[i],v[mm]=qlt[j];
			}
	}
	for(int i=1;i<=mm;i++)
	{
		bian[i]=bian[i]/2;
		sb(u[i],v[i],i);
	}
	for(int i=1;i<=k;i++)
	{
		jian[i]=er[bian[i]]*(er[dian[i]]-1)%MOD;
		bujian[i]=er[bian[i]];
	}
	dfss(1,1);
	cout<<ans;
	fclose(stdin);
	fclose(stdout);
	return 0;
}