#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e3 + 5;
const int M = 4000;
const int mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const long long llINF = 0x3f3f3f3f3f3f3f3f;
long long make_compiler_happy() { return INF & maxn & mod & llINF; }
long long fpow(long long a, long long b) {
  long long res = 1;
  a %= mod;
  assert(b >= 0);
  for (; b; b >>= 1) {
    if (b & 1) res = res * a % mod;
    a = a * a % mod;
  }
  return res;
}
long long inv(long long x) { return fpow(x, mod - 2); }
void add(int &x, int y) {
  x += y;
  if (x >= mod) x -= mod;
  if (x < 0) x += mod;
}
vector<int> g[maxn];
int n, m;
int dp[2][2][M * 2 + 1];
bool vis[maxn];
int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> n >> m;
  for (int i = 0; i < (m); i++) {
    int u, v;
    cin >> u >> v;
    u--, v--;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  vector<int> len;
  for (int v : g[0]) {
    if (vis[v]) continue;
    int u = 0, l = 1;
    while (v) {
      vis[v] = 1;
      l++;
      int tmp = v;
      v = u ^ g[v][0] ^ g[v][1];
      u = tmp;
    }
    len.push_back(l);
  }
  int cur = 0;
  dp[0][0][M] = 1;
  for (int l : len) {
    cur ^= 1;
    memset(dp[cur], 0, sizeof(dp[cur][0]) * (2));
    for (int t = 0; t < (2); t++) {
      for (int i = 0; i < (2 * M + 1); i++) {
        int v = dp[!cur][t][i];
        if (v) {
          add(dp[cur][t][i], v);
          add(dp[cur][t][i - l], v);
          add(dp[cur][t][i + l], v);
        }
      }
    }
    for (int i = (1); i <= (2 * M); i++)
      add(dp[!cur][0][i], dp[!cur][0][i - 1]);
    for (int i = 0; i < (2 * M + 1); i++) {
      add(dp[cur][1][i], dp[!cur][0][min(2 * M, i + l - 2)] * 2 % mod);
      if (i - l + 2 > 0)
        add(dp[cur][1][i], (mod - dp[!cur][0][i - l + 1]) * 2 % mod);
    }
  }
  int ans = dp[cur][1][M];
  cur = 0;
  memset(dp[0], 0, sizeof(dp[0][0]) * (2));
  dp[0][0][M] = 1;
  for (int l : len) {
    cur ^= 1;
    memset(dp[cur], 0, sizeof(dp[cur][0]) * (2));
    for (int t = 0; t < (2); t++) {
      for (int i = 0; i < (2 * M + 1); i++) {
        int v = dp[!cur][t][i];
        if (v) {
          add(dp[cur][t][i - l], v);
          add(dp[cur][t][i + l], v);
        }
      }
    }
    for (int i = 0; i < (2 * M + 1); i++) {
      int v = dp[!cur][0][i];
      if (v) {
        add(dp[cur][1][i - l + 1], 2 * v % mod);
        add(dp[cur][1][i + l - 1], 2 * v % mod);
      }
    }
  }
  add(ans, dp[cur][1][M]);
  add(ans, dp[cur][0][M]);
  cout << ans << '\n';
}
