// g++-13 5.cpp -std=c++17 -O2 -I .
#include <bits/stdc++.h>
using namespace std;
#include <atcoder/all>
using namespace atcoder;
using ll = long long;
using ld = long double;
using vi = vector<int>;
using vvi = vector<vi>;
using vll = vector<ll>;
using vvll = vector<vll>;
using vld = vector<ld>;
using vvld = vector<vld>;
using vst = vector<string>;
using vvst = vector<vst>;
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define pq_big(T) priority_queue<T,vector<T>,less<T>>
#define pq_small(T) priority_queue<T,vector<T>,greater<T>>
#define all(a) a.begin(),a.end()
#define rep(i,start,end) for(ll i=start;i<(ll)(end);i++)
#define per(i,start,end) for(ll i=start;i>=(ll)(end);i--)
#define uniq(a) sort(all(a));a.erase(unique(all(a)),a.end())
// https://judge.yosupo.jp/submission/108140
const int MOD = 1e9+7, N = 1024;
int x[N], n, m, ans;
bitset<N> adj[N], K;
void rec(int u, int t = 1) {
ans += t;
if(ans >= MOD) ans -= MOD;
for(int v = u + 1; v < n; ++v) {
if((K & adj[v]).count() != K.count()) continue;
K[v] = 1;
rec(v, 1ll * t * x[v] % MOD);
K[v] = 0;
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m;
for(int i = 0; i < n; ++i) x[i] = 1;
for(int i = 0; i < m; ++i) {
int u, v;
cin >> u >> v;
u--;
v--;
adj[u][v] = adj[v][u] = 1;
}
rec(-1);
cout << (ans + MOD - 1) % MOD << '\n';
}