#include<bits/stdc++.h>
using namespace std;

typedef long long lint;
typedef long double louble;

template<typename T1,typename T2> inline T1 max(T1 a,T2 b){return a<b?b:a;}
template<typename T1,typename T2> inline T1 min(T1 a,T2 b){return a<b?a:b;}

namespace ae86
{
	const int bufl = 1<<15;
	
	char buf[bufl],*s=buf,*t=buf;
	
	inline int fetch()
	{
		if(s==t){t=(s=buf)+fread(buf,1,bufl,stdin);if(s==t)return EOF;}
		return *s++;
	}
	
	inline int ty()
	{
		int a=0,b=1,c=fetch();
		while(!isdigit(c))b^=c=='-',c=fetch();
		while(isdigit(c))a=a*10+c-48,c=fetch();
		return b?a:-a;
	}
}
using ae86::ty;

const int _ = 307 , __ = _ << 1 , mo = 1000000007;

int n,nn,m,e[__]={0};
int oc[__]={0};

inline int frees(int l,int r){if(l>r)return 0;return r-l+1-(oc[r]-oc[l-1]);}

lint f[__][__],g[__]={0};

int main()
{
	n=ty(),m=ty(),nn=n+n;
	for(int i=1,a,b;i<=m;i++)a=ty(),b=ty(),e[a]=b,e[b]=a;
	for(int i=1;i<=nn;i++)oc[i]=oc[i-1]+(e[i]>0);

	g[0]=1;
	for(int i=2;i<=nn;i+=2)g[i]=g[i-2]*(i-1)%mo;

	lint ans=0;
	for(int i=1;i<=nn;i++)
		for(int j=i;j<=nn;j++)
		{
			int len=j-i+1;
			if(len&1)continue;
			for(int k=i;k<=j;k++)if(e[k] && (e[k]<i || e[k]>j))goto fail;
			f[i][j]=g[frees(i,j)];
			for(int k=i+1;k<j;k++)f[i][j]=(f[i][j]-f[i][k]*g[frees(k+1,j)]%mo+mo)%mo;
			ans=(ans+g[frees(1,i-1)+frees(j+1,nn)]*f[i][j]%mo)%mo;
		fail:;
		}
	printf("%lld\n",ans);

	return 0;
}
