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

inline int read(void)
{int _;cin>>_;return _;}

const int mod=1e9+7;
const int N=1e6+5;
const int inf=0x3f3f3f3f;

struct edge{
	int from,to,next;
}e[N<<2];
int head[N],cnt=1;

inline void add(int u,int v)
{
	e[++cnt].to=v;
	e[cnt].from=u;
	e[cnt].next=head[u];
	head[u]=cnt;
}

int c,n,m,ans,tot,k;
int dfn[N],low[N],col[N],cur[N],siz[N];
stack<int> stk;
pair<int,int> p[N];

namespace sub2
{
	vector<int> g[N];
	
	void tarjan(int u,int fa)
	{
		dfn[u]=low[u]=++tot;
		stk.push(u);
		for(int i=head[u];i;i=e[i].next)
		{
			int v=e[i].to;
			if(!dfn[v])
			{
				tarjan(v,u);
				low[u]=min(low[u],low[v]);
				if(dfn[u]<low[v])
				{
					for(c++;!stk.empty();)
					{
						int t=stk.top();
						stk.pop();
						col[t]=c;
						if(t==v) break;
					}
				}
			}
			if(v!=fa) 
				low[u]=min(low[u],dfn[v]);
		}
		return;
	}
	
	inline int qpow(int a,int n)
	{
		int ans=1;
		for(;n;n>>=1,a=a*a%mod)
			if(n&1)ans=ans*a%mod;
		return ans;
	}
	
	int f[N][2];
	/*
	f[i][0]-> meiyou
	f[i][1]-> you
	*/
	
	void dfs(int u,int fa)
	{
		f[u][1]=qpow(2,cur[u]);f[u][0]=1;siz[u]=1;
		for(auto v:g[u])if(v!=fa)
		{		
			dfs(v,u);
			f[u][0]=(f[u][0]*(f[v][0]*2%mod))%mod;
			f[u][1]=(f[u][1]*(f[v][0]*2%mod+f[v][1])%mod)%mod;
		}
		f[u][1]=(f[u][1]-f[u][0]+mod)%mod;
//		f[u][1]=(f[u][1]%mod+mod)%mod;
		return;
	}
	
	inline void solve(void)
	{
		tarjan(1,-1);c++;
		for(int i=1;i<=n;i++)
			if(!col[i]) col[i]=c;
		for(int i=1;i<=n;i++)
			cur[col[i]]++;
		for(int i=2;i<=cnt;i++)
		{
			int u=e[i].from,v=e[i].to;
			if(col[u]!=col[v]){
				g[col[u]].push_back(col[v]);
				g[col[v]].push_back(col[u]);
			}else k++;
		}
		for(int i=1;i<=c;i++)
		{
			sort(g[i].begin(),g[i].end());
			g[i].erase(unique(g[i].begin(),g[i].end()),g[i].end());
		}
		k=k/2;dfs(1,-1);
		for(int i=1;i<=c;i++)
			ans=(ans+f[i][1])%mod;
		cout<<ans*qpow(2,k)%mod<<endl;
	}
}

namespace sub1
{
	int fa[N],siz[N];
	
	int find(int x)
	{
		if(fa[x]==x) return x;
		return fa[x]=find(fa[x]);
	}
	
	bool merge(int x,int y)
	{
		x=find(x);y=find(y);
		if(x==y) return false;
		fa[x]=y; siz[y]+=siz[x];
		return true;
	}
	
	inline int qpow(int a,int n)
	{
		int ans=1;
		for(;n;n>>=1,a=a*a%mod)
			if(n&1)ans=ans*a%mod;
		return ans;
	}
	
	inline void solve(void)
	{
		for(int i=1;i<(1<<m);i++)
		{
			for(int i=1;i<=n;i++) fa[i]=i,siz[i]=1;
			for(int j=0;j<m;j++)
				if(i>>j&1) merge(p[j+1].first,p[j+1].second);
			for(int i=1;i<=n;i++)
				if(fa[i]==i) ans=(ans+qpow(2,siz[i])-1)%mod;
		}
		ans=(ans+n)%mod;
		cout<<ans<<endl;
		return;
	}
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	
	freopen("barrack.in","r",stdin);
	freopen("barrack.out","w",stdout);
	
	n=read();m=read();
	for(int i=1,u,v;i<=m;i++)
	{
		u=read();v=read();
		add(u,v);add(v,u);
		p[i].first=u;
		p[i].second=v;
	}
	if(m<=20)sub1::solve();
	else sub2::solve();
	return 0;
}

/*
3 2
1 2
1 3
*/