逆天记录
#include<bits/stdc++.h>
#define int long long
#define doub long double
using namespace std;
const int maxn=5e5+7;
const int mod=1e9+7;
int n,m;
vector<int> E[maxn];
int low[maxn];
int dfn[maxn];
int dfscount;
set<int> del[maxn];
vector<int> DCC[maxn];
int DCCcount;
int bel[maxn];
int vis[maxn];
void tarjan(int u,int fa){
low[u]=dfn[u]=++dfscount;
bool f=false;
for(int i=0;i<E[u].size();i++){
int v=E[u][i];
if(!dfn[v]){
tarjan(v,u);
low[u]=min(low[u],low[v]);
if(low[v]>dfn[u]){
del[u].insert(v);
del[v].insert(u);
}
}
else if(v!=fa||f){
low[u]=min(low[u],dfn[v]);
}
else f=1;
}
}
void DFS(int u){
vis[u]=true;
bel[u]=DCCcount;
DCC[DCCcount].push_back(u);
for(int i=0;i<E[u].size();i++){
int v=E[u][i];
if(del[u].count(v)||vis[v])continue;
DFS(v);
}
}
inline int qpow(int a,int b){
int ans=1;
while(b){
if(b&1)ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return ans;
}
int ans;
int N;
vector<int> T[maxn];
int Ed[maxn];
int Ve[maxn];
int s[maxn];
void dfs(int u,int fa){
s[u]=Ed[u];
for(int i=0;i<T[u].size();i++){
int v=E[u][i];
if(v==fa)continue;
dfs(v,u);
s[u]+=(1+s[v]);
}
}
int f[maxn][2];
void DP(int u,int fa){
for(int i=0;i<T[u].size();i++){
int v=T[u][i];
if(v==fa)continue;
DP(v,u);
f[u][1]=f[u][1]*((2ll*f[v][0]%mod+f[v][1])%mod)%mod;
f[u][1]=(f[u][1]+(f[u][0]*f[v][1])%mod)%mod;
f[u][0]=f[u][0]*2ll%mod*f[v][0]%mod;
}
if(u==1)ans=(ans+f[u][1])%mod;
else ans=(ans+f[u][1]*qpow(2,s[1]-s[u]-1)%mod)%mod;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
E[u].push_back(v);
E[v].push_back(u);
}
for(int i=1;i<=n;i++){
if(!dfn[i])tarjan(i,0);
}
for(int i=1;i<=n;i++){
if(!vis[i])++DCCcount,DFS(i);
}
N=DCCcount;
for(int u=1;u<=n;u++){
for(set<int>::iterator it=del[u].begin();it!=del[u].end();it++){
int v=*it;
T[bel[u]].push_back(bel[v]);
}
}
for(int i=1;i<=N;i++)Ve[i]=DCC[i].size();
for(int i=1;i<=n;i++){
for(int j=0;j<E[i].size();j++){
int v=E[i][j];
if(bel[i]==bel[v])Ed[bel[i]]++;
}
}
for(int i=1;i<=N;i++){
Ed[i]>>=1;
f[i][0]=qpow(2,Ed[i]);
f[i][1]=(qpow(2,Ve[i]+Ed[i])-qpow(2,Ed[i])+mod)%mod;
}
dfs(1,0);
DP(1,0);
cout<<ans<<endl;
return 0;
}