#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b) for (int i = (a), i##_end_ = (b); i <= i##_end_; ++i)
#define drep(i, a, b) for (int i = (a), i##_end_ = (b); i >= i##_end_; --i)
#define clar(a, b) memset((a), (b), sizeof(a))
#define debug(...) fprintf(stderr, __VA_ARGS__)
template <typename T> inline bool chkmax(T &a, const T &b) { return a < b ? a = b, 1 : 0; }
template <typename T> inline bool chkmin(T &a, const T &b) { return a > b ? a = b, 1 : 0; }
typedef long long LL;
typedef long double LD;
void procStatus() {
	ifstream t("proc/self/status");
	cerr << string(istreambuf_iterator<char>(t), istreambuf_iterator<char>()) << endl;
}
LL read() {
	LL x = 0, flag = 1;
	char ch = getchar();
	for (;!isdigit(ch); ch = getchar()) if (ch == '-') flag *= -1;
	for (;isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
	return x * flag;
}
void write(LL x) {
	if (x < 0) putchar('-'), x = -x;
	if (x >= 10) write(x / 10);
	putchar(x % 10 + '0');
}

const int Maxn = 1009, Mod = 1e9 + 7;
int mplus(int x, const int &y) {
	x += y;
	if (x >= Mod) x -= Mod;
	return x;
}	
int n, k, g[Maxn];
int dp[Maxn][Maxn];
vector <int> G[Maxn];

void Init() {
	n = read() * 2, k = read();
	rep (i, 1, n) {
		if (i & 1) continue;
		g[i] = 1;
		for (int j = 1; j <= i; j += 2) g[i] = g[i] * 1ll * j % Mod;
	}
	rep (i, 1, k) {
		int u = read(), v = read();
		G[u].push_back(v), G[v].push_back(u); 
	}
}

int cnt[Maxn], cnt1[Maxn];
void Solve() {
	int ans = 0;

	g[0] = 1;
	rep (i, 1, n) {
		cnt[i] = cnt[i - 1] + (G[i].size() != 0);
		cnt1[i] = cnt1[i - 1] + (G[i].size() == 0);
	}

	rep (i, 1, n) 
		rep (j, i, n) {
			if ((j - i + 1) & 1) continue;
			bool outer = false;
			rep (l, i, j) {
				rep (p, 0, G[l].size() - 1) 
					if (G[l][p] < i || G[l][p] > j) {
						outer = true;
						break;
					}
				if (outer) break;
			}
			if (outer) continue;
			dp[i][j] = g[cnt1[j] - cnt1[i - 1]];
			rep (l, i, j - 1) 
				dp[i][j] = mplus(dp[i][j], Mod - 1ll * dp[i][l] * g[cnt1[j] - cnt1[l]] % Mod);
			ans = mplus(ans, dp[i][j] * 1ll * g[cnt1[i - 1] + cnt1[n] - cnt1[j]] % Mod);
		}
	cout << ans << endl;
}

int main() {
//	freopen("bosky.in", "r", stdin);
//	freopen("bosky.out", "w", stdout);

	Init();
	Solve();	

#ifdef Qrsikno
	procStatus();
	debug("\nRunning time: %.3lf(s)\n", clock() * 1.0 / CLOCKS_PER_SEC);
#endif
	return 0;
}
