#ifndef BZ
#pragma GCC optimize "Ofast"
#endif
#include <bits/stdc++.h>
using namespace std;
using ull = uint64_t;
using ll = int64_t;
using ld = long double;

const ll MOD = 1e9 + 7;

ll pw(ll a, ll b) {
    if (!b) {
        return 1;
    }

    ll v = pw(a, b / 2);
    v = (v * v) % MOD;

    if (b & 1) {
        v = (v * a) % MOD;
    }

    return  v;
}

const int MAXN = 602;
ll f[MAXN];
ll g[MAXN][MAXN];
ll h[MAXN][MAXN];

int a[MAXN], b[MAXN];

int main() {
#ifdef BZ
    freopen("input.txt", "r", stdin);
#endif
    ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cout.setf(ios::fixed); cout.precision(20);
    int n, k;
    cin >> n >> k;
    f[0] = 1;
    for (int i = 1; i <= n; ++i) {
        f[i] = f[i - 1] * (2 * i - 1) % MOD;
    }

    for (int i = 0; i < k; ++i) {
        cin >> a[i] >> b[i];
    }

    ll ans = f[n - k];

    for (int l = 2 * n - 2; l >= 0; --l) {
        for (int r = l + 2; r < 2 * n; r += 2) {
            int c = (r - l) / 2;
            bool bad = false;
            for (int j = 0; j < k; ++j) {
                bool ga = (l < a[j] && a[j] <= r);
                bool gb = (l < b[j] && b[j] <= r);
                bad |= (ga != gb);
                c -= ga;
            }

            if (bad) {
                continue;
            }

            ll out = f[n - k - c];

            g[l][r] = f[c];
            h[l][r] = g[l][r];


            for (int q = l + 2; q < r; q += 2) {
                h[l][r] = (h[l][r] + MOD * MOD - g[l][q] * h[q][r]) % MOD;
            }

            ans = (ans + h[l][r] * out) % MOD;
        }
    }

    cout << ans << "\n";
}
 