#pragma GCC optimize (2)
#pragma G++ optimize (2)
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define mod 1000000007
#define MAX 605
using namespace std;
//char nc()
//{
//	static char buf[100000],*p1=buf,*p2=buf;
//	return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
//}
char nc(){return getchar();}
int read()
{
	int x=0,y=1;
	char c=nc();
	while(!isdigit(c))
	{
		if(c=='-')y=-1;
		c=nc();
	}
	while(isdigit(c))
	{
		x=(x<<1)+(x<<3)+(c^48);
		c=nc();
	}
	return x*y;
}
int n,K,p[MAX],sm[MAX];
long long f[MAX][MAX],g[MAX],ANS=0;
int in(int l,int r)
{
	return r-l+1-(sm[r]-sm[l-1]);
}
int out(int l,int r)
{
	return n-(r-l+1)-(K-(sm[r]-sm[l-1]));
}
int main()
{
	n=read();K=read();
	int x,y;
	for(int i=1;i<=K;i++)
		x=read(),y=read(),sm[x]++,sm[y]++,p[x]=y,p[y]=x;
	n<<=1;K<<=1;
	for(int i=1;i<=n;i++)
		sm[i]+=sm[i-1];
	g[0]=1;g[1]=0;
	for(int i=2;i<=n;i++)
		g[i]=g[i-2]*(i-1)%mod;
	for(int i=1;i<=n;i++)
		for(int j=i+1;j<=n;j++)
			if((j-i)&1)
			{
				bool flag=true;
				for(int k=i;k<=j;k++)
					if(p[k]&&(p[k]<i||p[k]>j))
					{
						flag=false;
						break;
					}
				if(!flag)
				{
					f[i][j]=0;
					continue;
				}
				f[i][j]=g[in(i,j)];
				for(int l=i+1;l<j;l++)
					f[i][j]=(f[i][j]-f[i][l]*g[in(l+1,j)])%mod;
				if(f[i][j]<0) f[i][j]+=mod;
				ANS=(ANS+f[i][j]*g[out(i,j)])%mod;
			}
	printf("%lld",ANS);
	return 0;
}