#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <cmath>
#include <bitset>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <algorithm>
#include <complex>
#include <unordered_map>
#include <unordered_set>
#include <random>
#include <cassert>
#include <fstream>
#define popcount __builtin_popcount
using namespace std;
typedef long long int ll;
typedef pair<ll, ll> P;
const ll MOD=1e9+7;
int main()
{
    int n, k; cin>>n>>k;
    int a[301], b[301];
    for(int i=0; i<k; i++){
        cin>>a[i]>>b[i]; a[i]--; b[i]--;
        if(a[i]>b[i]) swap(a[i], b[i]);
    }
    ll f[301]; f[0]=1;
    for(ll i=1; i<=n; i++) f[i]=(2*i-1)*f[i-1]%MOD;
    ll ct[601][601]={}, ct1[601][601]={}, ct2[601][601]={};
    ll ans=0;
    for(int i=1; i<2*n; i++){
        for(int j=i-1; j>=0; j-=2){
            int t=i-j+1, u=2*n-t;
            bool dame=0;
            for(int l=0; l<k; l++){
                if(j<=a[l] && b[l]<=i) t-=2;
                else if((j>a[l] && b[l]>i) || i<a[l] || b[l]<j) u-=2;
                else{
                    dame=1;
                    break;
                }
            }
            if(dame) continue;
            ct[j][i]=f[t/2], ct2[j][i]=f[u/2];
            ct1[j][i]=ct[j][i];
            for(int l=i-1; l>j; l-=2){
                ct1[j][i]-=ct[j][l-1]*ct1[l][i]%MOD;
                ct1[j][i]=(ct1[j][i]+MOD)%MOD;
            }
            ans+=ct1[j][i]*ct2[j][i];
          //cout<<ct1[j][i]<<" "<<ct2[j][i]<<" "<<j<<" "<<i<<endl;
            ans%=MOD;
        }
    }
    cout<<ans<<endl;
    return 0;
}