#include <bits/stdc++.h>
using namespace std;


#define int long long
const int N = 5010;
#define FORe(u) for(edge *cur=head[u];cur;cur=cur->nex)

const int M = 1e9 + 7;
int qpow(int x,int y) {
	int ans=1;
	while(y) {
		if(y&1) ans=ans*x%M;
		x=x*x%M;
		y>>=1;
	}
	return ans;
}


struct edge {
	int to,w;
	edge *nex;
}*head[N],*h[N];
void add(int u,int v,int w) {
	edge *cur=new edge;
	cur->to=v;
	cur->nex=head[u];
	cur->w=w;
	head[u]=cur;
}
void addh(int u,int v) {
	edge *cur=new edge;
	cur->to=v;
	cur->nex=h[u];
	h[u]=cur;
}
int f[N];
int find(int x) {
	if(f[x]==x) return x;
	return f[x]=find(f[x]);
}
void uni(int u,int fa) {
	f[find(u)]=find(fa);
}
bool check(int u,int v) {
	return find(u)==find(v);
}
int key[N];
int U[N],V[N],W[N];

int scc[N],scct,ecnt;
void dfs000(int u,int fa,int col) {
	scc[u]=col;
	for(edge *cur=head[u]; cur; cur=cur->nex) {
		if(cur->to==fa) continue;
		if(cur->w==1) continue;
		if(cur->w==0) {
			cur->w=1;
			ecnt++;
		}
		dfs000(cur->to,u,col);
	}
}

int n,m;
int dp[3010][3010],ans=0;
void dfs(int u,int fa) {
	int i,j;
	dp[u][1]=dp[u][0]=1;
	for(edge *cur=head[u]; cur; cur=cur->nex) {
		if(cur->to==fa) continue;
	}
	for(edge *cur=head[u]; cur; cur=cur->nex) {
		for(i=scct; i>1; i--) {
			for(j=0; j<=i; j++) {
				dp[u][i]+=dp[cur->to][j]*dp[u][i-j]%M;
			}
		}
	}
	for(i=1; i<=scct; i++) {
		ans+=dp[u][i]*(qpow(2,i)-1)%M;
		ans%=M;
	}
}
signed main() {
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	//remember to close sync! here!
//	ios::sync_with_stdio(0),cin.tie(0);
	int i,j,u,v;
	cin>>n>>m;
	for(i=1; i<=n; i++) f[i]=i;

	if(n<=6000) {
		for(i=1; i<=m; i++) cin>>u>>v,U[i]=u,V[i]=v;
		for(i=1; i<=m; i++) {
			for(i=1; i<=n; i++) f[i]=i;
			for(j=1; j<=m; j++) {
				uni(U[j],V[j]);
			}
			for(i=1; i<n; i++)
				if(!check(i,i+1)) {
					W[i]=1;
					break;
				}
			key[U[i]]=key[V[i]];
		}
		for(i=1; i<=m; i++) add(U[i],V[i],W[i]),add(V[i],U[i],W[i]);
		for(i=1; i<=n; i++) {
			if(!scc[i]) ++scct,dfs000(i,0,scct);
		}
		for(i=1; i<=m; i++) {
			if(scc[U[i]]!=scc[V[i]]) {
				addh(scc[U[i]],scc[V[i]]);
				addh(scc[V[i]],scc[U[i]]);
			}
		}
		dfs(1,0);
		cout<<ans*qpow(2,ecnt)%M;
	}
	return 0;
}
