#pragma GCC optimize("O3")
#include <bits/stdc++.h>
// #include <ext/pb_ds/assoc_container.hpp>
// using namespace __gnu_pbds;
// gp_hash_table<int, int> mapka;

using namespace std;
#define PB push_back
#define MP make_pair
#define LL long long
#define int LL
#define FOR(i,a,b) for(int i = (a); i <= (b); i++)
#define RE(i,n) FOR(i,1,n)
#define REP(i,n) FOR(i,0,(int)(n)-1)
#define R(i,n) REP(i,n)
#define VI vector<int>
#define PII pair<int,int>
#define LD long double
#define FI first
#define SE second
#define st FI
#define nd SE
#define ALL(x) (x).begin(), (x).end()
#define SZ(x) ((int)(x).size())

template<class C> void mini(C &a4, C b4) { a4 = min(a4, b4); }
template<class C> void maxi(C &a4, C b4) { a4 = max(a4, b4); }

template<class TH> void _dbg(const char *sdbg, TH h){ cerr<<sdbg<<'='<<h<<endl; }
template<class TH, class... TA> void _dbg(const char *sdbg, TH h, TA... a) {
  while(*sdbg!=',')cerr<<*sdbg++;
  cerr<<'='<<h<<','; _dbg(sdbg+1, a...);
}

template<class T> ostream &operator<<(ostream& os, vector<T> V) {
  os << "["; for (auto vv : V) os << vv << ","; return os << "]";
}
template<class L, class R> ostream &operator<<(ostream &os, pair<L,R> P) {
  return os << "(" << P.st << "," << P.nd << ")";
}

#ifdef LOCAL
#define debug(...) _dbg(#__VA_ARGS__, __VA_ARGS__)
#else
#define debug(...) (__VA_ARGS__)
#define cerr if(0)cout
#endif

const int P = 1e9 + 7;
int pot(int a,int w){
  int r = 1;
  while(w){
    if(w & 1){
      r = r * a % P;
    }
    w/=2;
    a = a * a % P;
  }
  return r;
}
const int MAX = 601;
void add(int &a,int b){
  a += b;
  if(a >= P)
    a -= P;
}
void sub(int &a,int b){
  a -= b;
  if(a < 0){
    a += P;
  }
}

int mul(int a,int b){
  return a * b % P;
}
int n,k;
int zaj[MAX],zle[MAX][MAX],dp[MAX][MAX],pary[MAX],odw[MAX];
int dziel(int a,int b){
  if(a&1)return 0;
  if(b&1)return 0;
  return odw[a] * pary[b] % P * pary[a-b] % P;
}
int mno(int a,int b){
  if(a&1)return 0;
  if(b&1)return 0;
  return pary[a] * odw[b] % P * odw[a-b] % P;
}
bool cz[MAX][MAX];
int licz(int a,int b){
  if(zle[a][b] || ((a + b) & 1))return 0;
  if(cz[a][b])return dp[a][b];
  cz[a][b] = 1;
  int& res = dp[a][b];
  int ak = a + 1;
  int ile = 0;
  while(1){
    if(ak == n * 2)ak = 0;
    if(zaj[ak] == 0)ile++;
    if(ak == b)break;
    ak++;
  }
  res = dziel(n * 2 - 2 * k, ile);
  debug(a,b,ile,res);
  ak = a + 1;
  int ile2 = 0;
  while(1){
    if(ak == n * 2)ak = 0;
    if(zaj[ak] == 0)ile2++;
    if(ak == b)break;
    int pom = licz(a,ak);
    if(a == b)debug( pom , ile,ile2 , dziel(ile,ile2));
    sub (res, mul(licz(a,ak),dziel(2 * n - 2 * k - ile2, ile - ile2)));
    ak++;
  }
  return res;
  
}
int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout << fixed << setprecision(11);
  cerr << fixed << setprecision(6);
  cin >> n >> k;
  R(_,k){
    int a,b;
    cin >> a >> b;
    if(a > b)swap(a,b);
    a--;b--;
    zaj[a] = 1;
    zaj[b] = 1;
    for(int i = a; i < b; i++){
      for(int j = b; j < 2 * n; j++){
        zle[i][j] = zle[j][i] = 1;
      }
      for(int j = 0; j < a; j++){
        zle[i][j] = zle[j][i] = 1;
      }
    }
  }
  pary[0] = 1;
  pary[1] = 0;
  for(int i = 2; i <= n * 2; i++){
    pary[i] = mul(pary[i-2], i - 1);
  }
  R(i,n*2+1){
    odw[i] = pot(pary[i], P-2);
  }
  int res = 0;
//   R(i,n*2)R(j,n*2){
//     if(i != j){
//       int pom = licz(i,j);
//       debug(i,j,pom);
//       add(res,pom);
//     }
//   }
  //sub(res,licz(0,0));
  //debug(licz(0,0));
  R(i,n*2)R(j,i){
    int pom = licz(j,i);
    debug(i,j,pom);
    add(res, pom);
//     int pom = 0;
//     for(int l = j + 1; l <= i; l++){
//       if(zaj[l] == 0)pom++;
//     }
//     sub(res, mul(mul(licz(i,j),licz(j,i)), mno(2 * n - 2 * k, pom)));
  }
  add(res,1);
//   int spoj = 1;
//   R(i,n*2)R(j,i){
//     sub(spoj,licz(i,j));
//   }
//   debug(spoj);
//   add(res,spoj);
  cout << mul(res,pary[2 * n - 2 * k]) << "\n";
}


Measured memory_bytes: 6144