#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int mod=1e9+7;
int add(int x,int y){return x+y<mod?x+y:x+y-mod;}
void ade(int& x,int y){x+=y;if(x>=mod)x-=mod;}
int qpow(int x,int k)
{
	int r=1;
	while(k)
	{
		if(k&1)r=1ll*r*x%mod;
		k>>=1;x=1ll*x*x%mod;
	}
	return r;
}
int T;
int n,m;
int f[660][660];
int ed[660];
int pre[660];
int g[660];
bool check(int l,int r)
{
	for(int i=l;i<=r;++i) if(ed[i]&&(ed[i]<l||ed[i]>r))return 0;
	return 1;
}
int getr(int l,int r){return r>=l?pre[r]-pre[l-1]:0;}
int calc(int l,int r)
{
	int res=g[getr(l,r)];
	for(int i=l+1;i<r;i+=2)
		ade(res,mod-1ll*f[l][i]*g[getr(i+1,r)]%mod);
	return res;
}
int main()
{
	g[0]=1;
	for(int i=2;i<=600;i+=2)g[i]=1ll*g[i-2]*(i-1)%mod;
	memset(f,0,sizeof(f));
	memset(ed,0,sizeof(ed));
	memset(pre,0,sizeof(pre));
	scanf("%d%d",&n,&m);
	int x,y;
	for(int i=1;i<=m;++i)
	{
		scanf("%d%d",&x,&y);
		ed[x]=y;
		ed[y]=x;
	}
	for(int i=1;i<=n*2;++i) pre[i]=pre[i-1]+(!ed[i]);
	int ans=0;
	for(int l=1;l<=n*2;++l)
		for(int r=l+1;r<=n*2;r+=2)
			if(check(l,r))
			{
				f[l][r]=calc(l,r);
//				cout<<"l: "<<l<<" r: "<<r<<" f: "<<f[l][r]<<" re: "<<getr(1,l-1)+getr(r+1,n*2)<<endl;
				ade(ans,1ll*f[l][r]*g[getr(1,l-1)+getr(r+1,n*2)]%mod);
			}
	printf("%d\n",ans);
	return 0;
}
