#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstdlib>
#define LL long long
#define LD long double
using namespace std;
const int NN=2*300 +117;
const int MM= +117;
int read(){
	int fl=1,x;char c;
	for(c=getchar();(c<'0'||c>'9')&&c!='-';c=getchar());
	if(c=='-'){fl=-1;c=getchar();}
	for(x=0;c>='0'&&c<='9';c=getchar())
		x=(x<<3)+(x<<1)+c-'0';
	return x*fl;
}
void open(){
	freopen("a.in","r",stdin);
	//freopen("a.out","w",stdout);
}
void close(){
	fclose(stdin);
	fclose(stdout);
}


int m,n;
int e[NN][2]={};
LL dp[NN][NN]={};
int s[NN]={};
bool ok[NN][NN]={};
inline int cnt(int l,int r){
	return s[r]-s[l-1];
}
bool inside(int x,int l,int r){
	return l<=x&&x<=r;
}
LL v[NN]={};
const int mod=1e9+7;
int main(){
	//open();
	n=read()*2;
	m=read();
	v[0]=1;
	for(int i=2;i<=n;++i){
		v[i]=v[i-2]*(i-1)%mod;
	}
	for(int i=1;i<=m;++i){
		e[i][0]=read(),e[i][1]=read();
		s[e[i][0]]++;
		s[e[i][1]]++;
	}
	for(int i=1;i<=n;++i){
		s[i]+=s[i-1];
	}
	for(int i=1;i<=n;++i){
		for(int j=i+1;j<=n;++j){
			ok[i][j]=1;
			for(int k=1;k<=m;++k){
				if(inside(e[k][0],i,j)^inside(e[k][1],i,j)){
					ok[i][j]=0;
					break;
				}
			}
		}
	}
	LL op=0;
	for(int len=2;len<=n;len+=2){
		for(int i=1;i+len-1<=n;++i){
			int j=i+len-1;
			if(!ok[i][j])continue;
			LL ans=v[len-cnt(i,j)];
			for(int c=i+1;c<j;c+=2){
				ans-=dp[i][c]*v[j-c-cnt(c+1,j)]%mod;
			}
			ans%=mod;
			dp[i][j]=ans;
			ans=ans*v[n-len-2*m+cnt(i,j)]%mod;
			op+=ans;
			//if(ans)cerr<<i<<" "<<j<<": "<<ans<<endl;
			op%=mod;
		}
	}
	op=(op+mod)%mod;
	printf("%lld\n",op);
	close();
	return 0;
}