#include<bits/stdc++.h>
using namespace std;
const int TT=1000000007;
struct ZS{
	int id,color;
	bool operator <(const ZS b)const{return color<b.color||(color==b.color&&id<b.id);}
}flg[5005],c[5005];
int n,m,tot,TOT,lenc;
int q[5005],col[5005],fa[5005],du[5005];
int lnk[5005],nxt[10005],son[10005],eg[2][5005];
int LNK[5005],NXT[10005],SON[10005];
int z[2][5005],len;
int mp[5005][5005];
int f[5005];
long long ans;
long long jc[5005];
long long F[3005][3005],FF[3005][3005]; 
bool vis[5005];
inline int read(){
	int ret=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
	while(isdigit(ch)){ret=ret*10+ch-'0';ch=getchar();}
	return ret*f;
}
void make(int x,int y){son[++tot]=y;nxt[tot]=lnk[x];lnk[x]=tot;}
int check(int x,int y){
	int hed=0,til=1;q[1]=x;vis[x]=1;
	while(hed^til)
		for(int i=lnk[q[++hed]];i;i=nxt[i]){
			if(q[hed]==x&&son[i]==y)continue;
			if(!vis[son[i]])q[++til]=son[i],vis[son[i]]=1;
			if(son[i]==y)return 1;
		}
	return 0;
}
void BFS(int x,int id){
	int hed=0,til=1;q[1]=x;flg[x]=(ZS){x,f[0]};
	while(hed^til){
		for(int i=lnk[q[++hed]];i;i=nxt[i]){
			if(mp[q[hed]][son[i]]==2)continue;
			if(!flg[son[i]].color)q[++til]=son[i],flg[son[i]]=(ZS){son[i],f[0]};
		}
		col[q[hed]]=f[0];
	}
	f[f[0]]=hed;
}
void dfs(int x){
	for(int i=c[col[x]].id;i<=c[col[x]].color;i++)
	for(int j=1;j<=n;j++)
	if(mp[flg[i].id][j]==2&&fa[col[flg[i].id]]!=col[j]){
		fa[col[j]]=col[flg[i].id];du[col[flg[i].id]]++;
		dfs(j);
	}
}
void topo(){
	int hed=0,til=0;
//	for(int i=0;i<=f[0];i++)F[i][0]=1;
	for(int i=1;i<=f[0];i++)F[i][1]=jc[c[i].color-c[i].id+1]-1;
	for(int i=1;i<=f[0];i++)if(!du[i])q[++til]=i;
	while(hed^til){
		hed++;
		if(!fa[q[hed]])return;
		for(int i=0;i<=f[0];i++)FF[fa[q[hed]]][i]=F[fa[q[hed]]][i];
		for(int j=1;j<=f[0];j++)
		for(int i=f[0];i>=j;i--)
		FF[fa[q[hed]]][i]=(FF[fa[q[hed]]][i]+F[fa[q[hed]]][i-j]*F[q[hed]][j])%TT;
		for(int i=0;i<=f[0];i++)F[fa[q[hed]]][i]=FF[fa[q[hed]]][i];
		if(!(--du[fa[q[hed]]]))q[++til]=fa[q[hed]];
	}
}
int main(){
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	n=read();m=read();jc[0]=1;
	for(int i=1;i<=m;i++)jc[i]=(jc[i-1]*2)%TT;
	for(int i=1;i<=m;i++){
		int x=read(),y=read();
		mp[x][y]=mp[y][x]=1;
		make(x,y);make(y,x);
		eg[0][i]=x;eg[1][i]=y;
	}
	for(int i=1;i<=m;i++){
		if(!check(eg[0][i],eg[1][i])){z[0][++len]=eg[0][i];z[1][len]=eg[1][i];}
		memset(vis,0,sizeof vis);
	}
	for(int i=1;i<=len;i++)mp[z[0][i]][z[1][i]]=mp[z[1][i]][z[0][i]]=2;
	for(int i=1;i<=n;i++)if(!flg[i].color)BFS(i,++f[0]);
	sort(flg+1,flg+1+n);
	for(int i=1;i<=n+1;i++)if(flg[i].color!=flg[i-1].color)c[lenc].color=i-1,c[++lenc].id=i;
	dfs(1);
	topo();
	for(int i=1;i<=f[0];i++)
	for(int j=1;j<=f[0];j++)
	ans=(ans+F[i][j]*(jc[m-j+1]))%TT;
	printf("%lld\n",ans);
//	for(int i=1;i<=f[0];i++)printf("%d\n",fa[i]);
//	for(int i=1;i<=n;i++)printf("%d %d\n",flg[i].id,flg[i].color);
//	for(int i=1;i<=f[0];i++)printf("%d\n",f[i]);
	return 0;                   
}