// goodbye oi
#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int,int> pi;
inline int gin() {
    int s=0,f=1;
    char c=getchar();
    while(c<'0' || c>'9') {
        if(c=='-') f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9') {
        s=(s<<3)+(s<<1)+(c^48);
        c=getchar();
    }
    return s*f;
}

const int N=5e5+5,mod=1e9+7;
int n,m,bin[N];
int tot=1,head[N],to[N<<1],ne[N<<1];
int dfc,dfn[N],low[N];
vector<pi> E;

int qpow(int a,int b) {
    int res=1;
    while(b) {
        if(b&1) res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}

inline void add(int u,int v) {
    to[++tot]=v;
    ne[tot]=head[u];
    head[u]=tot;
}

void tarjan(int u,int e) {
    dfn[u]=low[u]=++dfc;
    for(int i=head[u];i;i=ne[i]) if((i^1)!=e) {
        int v=to[i];
        // if(v==fa) continue;
        if(!dfn[v]) {
            tarjan(v,i);
            low[u]=min(low[u],low[v]);
        }
        else low[u]=min(low[u],dfn[v]);
        if(dfn[u]<low[v]) E.push_back({u,v});
    }
}

signed main() {
    freopen("barrack.in","r",stdin);
    freopen("barrack.out","w",stdout);
    n=gin(),m=gin();
    int x=500000004;
    bool tag=1;
    for(int i=1;i<=m;i++) {
        int u=gin(),v=gin();
        add(u,v),add(v,u);
        if(!(u==i && v==i+1)) tag=0;
    }
    bin[0]=1;
    for(int i=1;i<=500000;i++) bin[i]=bin[i-1]*2%mod;
    if(tag) {
        printf("%lld\n",bin[n-2]*n%mod*(n-1)%mod*x%mod);
        return 0;
    }
    // tarjan(1,-1);
    // for(int i=1;i<=n;i++) printf("# %lld %lld\n",dfn[i],low[i]);
    // for(pi e:E) {
    //     // printf("%lld %lld\n",e.first,e.second);
    //     int u=e.first,v=e.second;
    //     if(!co[u]) co[u]=++col,dfs(u);
    //     if(!co[v]) co[v]=++col,dfs(v);
    //     g[co[u]].push_back(co[])

    // }
    return 0;
}