/*
#include <boost/functional/hash.hpp>
#include <boost/multiprecision/cpp_int.hpp>
typedef boost::multiprecision::cpp_int mlint;
*/
#include <bits/stdc++.h>
using namespace std;

#define debug 0
#define print(x) cout << #x << " = " << (x) << " (L" << __LINE__ << ")" << endl
#define fcout(d) cout << fixed << setprecision(d)
#define each(i,v) for(auto i = begin(v); i != end(v); ++i)
#define reach(i,v) for(auto i = rbegin(v); i != rend(v); ++i)
#define urep(i,s,t) for(int i = (int)(s); i <= (int)(t); ++i)
#define drep(i,s,t) for(int i = (int)(s); i >= (int)(t); --i)
#define rep(i,n) urep(i,0,(n) - 1)
#define rep1(i,n) urep(i,1,(n))
#define rrep(i,n) drep(i,(n) - 1,0)
#define all(v) begin(v),end(v)
#define rall(v) rbegin(v),rend(v)
#define vct vector
#define prique priority_queue
#define l_bnd lower_bound
#define u_bnd upper_bound
#define rsz resize
#define ers erase
#define emp emplace
#define emf emplace_front
#define emb emplace_back
#define pof pop_front
#define pob pop_back
#define mkp make_pair
#define mkt make_tuple
#define fir first
#define sec second

typedef long long ll;
typedef double db;
typedef vct<vct<ll>> mat;
typedef pair<int,int> pii;
typedef tuple<int,int,int> tiii;
typedef map<int,int> mpii;
typedef unordered_map<int,int> umpii;

template <class T, class U> ostream& operator << (ostream& s, pair<T,U> p) { return s << p.fir << " " << p.sec; }
template <class T> ostream& operator << (ostream& s, vct<T> v) { each(i,v) { if(i != begin(v)) s << " "; s << *i; } return s; }

auto esc = [](auto ret) { cout << ret << endl; exit(0); };
auto odd = [](auto x) { return x & 1; };
auto even = [](auto x) { return !odd(x); };
auto qceil = [](auto x, auto y) { return x > 0 ? (x - 1) / y + 1 :  x / y; };
auto parity = [](auto x, auto y) { return odd(x) ^ even(y); };
auto chmax = [](auto& m, auto x) { if(m < x) { m = x; return 1; } return 0; };
auto chmin = [](auto& m, auto x) { if(m > x) { m = x; return 1; } return 0; };
auto cmprs  = [](auto& v) {
    auto tmp = v;
    sort(all(tmp));
    tmp.erase(unique(all(tmp)),end(tmp));
    for(auto it = begin(v); it != end(v); ++it) *it = l_bnd(all(tmp),*it) - begin(tmp) + 1;
    return tmp.size() != v.size();
};

const int dir[8][2] = { {1,0},{0,1},{-1,0},{0,-1},{1,1},{-1,1},{-1,-1},{1,-1} };
const ll inf32 = (1 << 30) - 1;
const ll inf64 = (1LL << 62) - 1;
const ll mod = 1e9 + 7;
const db eps = 1e-15;

int N,K;
vct<pii> P;
ll dp[620][620],f[620] = {};
int in[620][620],out[620][620];
bool ch[620][620] = {};

// for the interval [i,j)
inline ll cal(int i, int j){
    if(~dp[i][j]) return dp[i][j];
    if(ch[i][j]) return dp[i][j] = 0;
    dp[i][j] = f[in[i][j]];
    for(int k = i + 2; k < j; k += 2) (dp[i][j] -= cal(i,k) * f[in[k][j]]) %= mod;
    dp[i][j] = (dp[i][j] + mod) % mod;
    return dp[i][j];
}

int main() {
    cin.tie(0);
    ios::sync_with_stdio(false);

    rep(i,620)rep(j,620) dp[i][j] = -1;

    f[0] = 1;
    for(int i = 1; i < 610; i += 2) f[i + 1] = f[i - 1] * i % mod;

    cin >> N >> K;
    N *= 2;
    rep(i,N)urep(j,i,N) in[i][j] = j - i;
    rep(w,K){
        int a,b;
        cin >> a >> b;
        if(a > b) swap(a,b);
        P.emb(--a,--b);
        rep(i,a + 1)urep(j,b + 1,N) in[i][j] -= 2;
        rep(i,a + 1)urep(j,a + 1,b) ch[i][j] = 1;
        urep(j,b + 1,N)urep(i,a + 1,b) ch[i][j] = 1;
    }
    
    rep(i,N)urep(j,i,N) out[i][j] = N - 2 * K - in[i][j];

    ll ans = 0;
    rep(i,N)for(int j = i + 2; j <= N; j += 2){
        ans = (ans + cal(i,j) * f[out[i][j]]) % mod;
    }
    esc(ans);
}


Measured memory_bytes: 6656