// includes {{{
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<deque>
#include<map>
#include<set>
#include<tuple>
#include<cmath>
#include<random>
#include<cassert>
// }}}
// #include<bits/stdc++.h>
using namespace std;
using ll = long long;

// #undef DEBUG
// #define DEBUG
// DEBUG {{{
#include <stack>
#include <tuple>
#include <valarray>
#include <vector>
// clang-format off
template<int n, class...T> typename enable_if<(n>=sizeof...(T))>::type _ot(ostream &, tuple<T...> const &){}
template<int n, class...T> typename enable_if<(n< sizeof...(T))>::type _ot(ostream & os, tuple<T...> const & t){ os << (n==0?"":", ") << get<n>(t); _ot<n+1>(os, t); }
template<class...T> ostream & operator<<(ostream &o, tuple<T...> const &t){ o << "("; _ot<0>(o, t); o << ")"; return o; }
template<class T, class U> ostream & operator<<(ostream &o, pair<T, U> const &p) { o << "(" << p.first << ", " << p.second << ")"; return o; }
template < class T > ostream &operator<<(ostream &o, const stack<T> &a) { o << "{"; for(auto tmp = a; tmp.size(); tmp.pop()) o << (a.size() == tmp.size() ? "" : ", ") << tmp.top(); o << "}"; return o; }
#ifdef DEBUG
#if !defined(DEBUG_OUT)
// #define DEBUG_OUT cerr
#endif
#if !defined(DEBUG_LEFT)
// #define DEBUG_LEFT "\e[1;36m"
#endif
#if !defined(DEBUG_RIGHT)
// #define DEBUG_RIGHT ":\e[m"
#endif
#define dump(...) [&](){auto __debug_tap=make_tuple(__VA_ARGS__);DEBUG_OUT<<DEBUG_LEFT<<__LINE__ << DEBUG_RIGHT << " " <<#__VA_ARGS__<<" = "<<__debug_tap<<endl;}()
template < class T > inline void dump2D(T &d, size_t sizey, size_t sizex) { for(size_t i = 0; i < sizey; i++) { DEBUG_OUT << "\t"; for(size_t j = 0; j < sizex; j++) DEBUG_OUT << d[i][j] << (j + 1 == sizex ? "" : "\t"); DEBUG_OUT << endl; } }
template < class T, class = typename iterator_traits< typename T::iterator >::value_type, class = typename enable_if<!is_same<T, string>::value>::type > ostream &operator<<(ostream &o, const T &a) { o << "{"; for(auto ite = a.begin(); ite != a.end(); ++ite) o << (ite == a.begin() ? "" : ", ") << *ite; o << "}"; return o; }
#else
#define dump(...) (42)
#define dump2D(...) (42)
template < class T, class = typename iterator_traits< typename T::iterator >::value_type, class = typename enable_if<!is_same<T, string>::value>::type > ostream &operator<<(ostream &o, const T &a) { for(auto ite = a.begin(); ite != a.end(); ++ite) o << (ite == a.begin() ? "" : " ") << *ite; return o; }
#endif
// clang-format on
// }}}


// you must write return 0; !!
// time measuring {{{
#ifdef DEBUG
#ifdef USE_COUT
#define main __main(); int main() { clock_t beg = clock(); __main(); clock_t end = clock(); cout << "time: " << double(end - beg) / CLOCKS_PER_SEC << "s" << endl; } int __main
#else
#define main __main(); int main() { clock_t beg = clock(); __main(); clock_t end = clock(); cerr << "time: " << double(end - beg) / CLOCKS_PER_SEC << "s" << endl; } int __main
#endif
#endif
// }}}


const int mod = 1e9 + 7;

int n;
int k;
int a[300], b[300];
ll emp[601*2];
ll fact2[601];

void init() {
  fact2[0] = 1;
  fact2[1] = 1;
  for(int i = 2; i < 601; i++) fact2[i] = i * fact2[i-2] % mod;
}

ll dp[601][601];

ll range(int i, int j) {
  if(i>j) j += 2*n;
  ll res = emp[j];
  if(i-1>=0) res-=emp[i-1];
  return res;
}

ll g(int i, int j) {
  ll r = range(i, j);
  if(r==0) return 1;
  if(r%2==0) {
    return fact2[r-1];
  }
  return 0;
}

int match[601]; ////

int main() {
  std::ios::sync_with_stdio(false), std::cin.tie(0);
  init();
  cin >> n >> k;
  for(int i = 0; i < 2 * n; i++) emp[i] = 1, match[i]=-1;
  for(int i = 0; i < k; i++) {
    cin >> a[i] >> b[i];
    a[i]--, b[i]--;
    emp[a[i]] = emp[b[i]] = 0;
    match[a[i]] = b[i];
    match[b[i]] = a[i];
  }
  for(int i = 0; i < 2 * n; i++) emp[i+2*n] = emp[i];
  for(int i = 1; i < 2 * n * 2; i++) emp[i] += emp[i-1];

  ll ans = 0;
  vector<int> flag(2*n);
  int cnt = 1;
  for(int w = 1; w <= 2 * n - 1; w++) {
    for(int i = 0; i < 2 * n; i++) {
      int j = i + w;
      int j1 = (i + w + 1) % (2 * n);
      if(j>=2*n) break;
      cnt++;
      for(int l = i; l <= j; l++) {
        if(match[l]!=-1) flag[match[l]] = cnt;
      }
      int no = 0;
      for(int l = 0; l < i; l++) {
        if(flag[l]==cnt) { no = 1; break; }
      }
      if(!no) for(int l = j + 1; l < 2 * n; l++) {
        if(flag[l]==cnt) { no = 1; break; }
      }
      if(no) dp[i][j] = 0;
      else {
        ll x = g(i,j);
        for(int l = i; l != j; l++, l%=2*n) {
          x -= dp[i][l] * g((l+1)%(2*n), j) % mod;
        }
        x = ((x % mod + mod) % mod);
        dp[i][j] = x;
        int r = emp[2*n-1] - range(i,j);
        x *= r == 0 ? 1 : fact2[r-1]; ///
        ans += x % mod;
      }
    }
  }
  ans = (ans % mod + mod) % mod;
  cout << ans << endl;
  return 0;
}


Measured memory_bytes: 3072