- import java.io.BufferedOutputStream; 
- import java.io.BufferedReader; 
- import java.io.FileInputStream; 
- import java.io.FileNotFoundException; 
- import java.io.FileOutputStream; 
- import java.io.IOException; 
- import java.io.InputStream; 
- import java.io.InputStreamReader; 
- import java.io.OutputStream; 
- import java.io.PrintWriter; 
- import java.math.BigInteger; 
- import java.util.Arrays; 
- import java.util.StringTokenizer; 
-   
- public class Main { 
- 	public static void-  main (String[]-  args ) {
 
- 		try { 
- 		} 
- 		Kattio io = new Kattio(input, output); 
- 		(new Solve(io)).main(); 
- 		io.close(); 
-   
- 			try { 
- 				input.close(); 
-   
- 			} 
- 			try { 
- 				output.close(); 
-   
- 			} 
- 	} 
- } 
-   
- class Solve { 
-   
- 	static final long mod = (long) 1e9+7; 
-   
- 	Kattio io; 
-   
- 	int n,k; 
- 	int[] a,b; 
- 	int[] f; 
-   
-   
- 	Solve(Kattio io) { 
- 		this.io = io; 
- 	} 
-   
- 	{ 
- 		if (!- memoWaysToPair [- x ]- . equals(new Long("-1")))
 
- 			return memoWaysToPair[x]; 
-   
- 		if (x%2==1)  
- 			memoWaysToPair [- x ]=new Long(0);
- 		else 
- 		if (x==0) 
- 			memoWaysToPair [- x ]=new Long(1);
- 		else 
- 			memoWaysToPair[x]=waysToPair(x-2)*(x-1)%mod; 
-   
- 		//io.println(x+" "+memoWaysToPair[x]); 
- 		return memoWaysToPair[x]; 
- 	} 
-   
- 	int paired(int x,int y) 
- 	{ 
- 		//io.println(x+" "+y+" "+((f[y]-f[x-1])>(y-x+1))); 
- 		return f[y]-f[x-1]; 
- 	} 
-   
- 	boolean inside(int a,int x,int y) 
- 	{ 
- 		return (x<=a && a<=y); 
- 	} 
-   
- 	{ 
- 		if (!- dp [- x ][- y ]- . equals(new Long("-1"))) return-  dp [- x ][- y ];
 
-   
- 		int notPairedinXY = (y-x+1)-paired(x,y); 
-   
- 		//io.println(notPairedOutSideXY<0); 
-   
- 		for (int i=1; i<=k; i++) 
- 		{ 
- 			boolean p1 = inside(a[i],x,y); 
- 			boolean p2 = inside(b[i],x,y); 
- 			if (p1!=p2) 
- 			{ 
- 				return dp[x][y]; 
- 			} 
- 		} 
-   
- 		dp[x][y]=waysToPair(notPairedinXY); 
-   
- 		//io.println(x+" "+y+" "+dp[x][y]); 
-   
- 		for (int z=x+1; z<y; z++) 
- 		{ 
- 			int notPairedinZY = (y-(z+1)+1)-paired(z+1,y); 
- 			dp[x][y]=(dp[x][y]-caldp(x,z)*waysToPair(notPairedinZY)+mod*mod)%mod; 
- 		} 
-   
- 		//io.println(x+" "+y+" "+dp[x][y]); 
-   
- 		return dp[x][y]; 
-   
- 	} 
- 	void main() { 
- 		//io.println(mod); 
- 		n=io.getInt(); 
- 		n*=2; 
- 		k=io.getInt(); 
- 		a = new int[k+1]; 
- 		b = new int[k+1]; 
- 		f = new int[n+1]; 
-   
-   
- 		for (int i=1; i<=k; i++) 
- 		{ 
- 			a[i] = io.getInt(); 
- 			b[i] = io.getInt(); 
- 			f[a[i]]=1; 
- 			f[b[i]]=1; 
- 		} 
-   
- 		for (int i=1; i<=n; i++) 
- 			f[i]+=f[i-1]; 
-   
-   
- 		for (int i=0; i<=n; i++) 
-   
- 		memoWaysToPair  = new Long[- n +1];
-   
- 		for (int x=1; x<=n; x++) 
- 			for (int y=x; y<=n; y++) 
- 			{ 
- 				int notPairedOutSideXY = (n-(y-x+1))-(f[n]-paired(x,y)); 
- 				res=(res+caldp(x,y)*waysToPair(notPairedOutSideXY)%mod)%mod; 
- 			} 
-   
- 		io.print(res); 
- 	} 
- } 
-   
- 	} 
-   
- 	} 
-   
- 	public boolean hasMoreTokens() { 
- 		return peekToken() != null; 
- 	} 
-   
- 	public int getInt() { 
- 		return Integer- . parseInt(- nextToken ());
 
- 	} 
-   
- 	public double getDouble() { 
- 		return Double- . parseDouble(- nextToken ());
 
- 	} 
-   
- 	public long getLong() { 
- 		return Long- . parseLong(- nextToken ());
 
- 	} 
-   
- 		return nextToken(); 
- 	} 
-   
-   
- 		if (token == null) 
- 			try { 
- 				while (st == null || !st.hasMoreTokens()) { 
- 					line = r.readLine(); 
- 					if (line == null) 
- 						return null; 
- 				} 
- 				token = st.nextToken(); 
- 			} 
- 		return token; 
- 	} 
-   
- 		token = null; 
- 		return ans; 
- 	} 
- } 
				aW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CmltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwppbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CmltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwppbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwppbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwppbXBvcnQgamF2YS51dGlsLkFycmF5czsKaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CgpwdWJsaWMgY2xhc3MgTWFpbiB7CglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CgkJSW5wdXRTdHJlYW0gaW5wdXQ7CgkJT3V0cHV0U3RyZWFtIG91dHB1dDsKCQl0cnkgewoJCQlpbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oImlucHV0LnR4dCIpOwoJCQlvdXRwdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSgib3V0cHV0LnR4dCIpOwoJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CgkJCWlucHV0ID0gU3lzdGVtLmluOwoJCQlvdXRwdXQgPSBTeXN0ZW0ub3V0OwoJCX0KCQlLYXR0aW8gaW8gPSBuZXcgS2F0dGlvKGlucHV0LCBvdXRwdXQpOwoJCShuZXcgU29sdmUoaW8pKS5tYWluKCk7CgkJaW8uY2xvc2UoKTsKCgkJaWYgKGlucHV0IGluc3RhbmNlb2YgRmlsZUlucHV0U3RyZWFtKQoJCQl0cnkgewoJCQkJaW5wdXQuY2xvc2UoKTsKCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewoKCQkJfQoJCWlmIChvdXRwdXQgaW5zdGFuY2VvZiBGaWxlT3V0cHV0U3RyZWFtKQoJCQl0cnkgewoJCQkJb3V0cHV0LmNsb3NlKCk7CgkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKCgkJCX0KCX0KfQoKY2xhc3MgU29sdmUgewoJCglzdGF0aWMgZmluYWwgbG9uZyBtb2QgPSAobG9uZykgMWU5Kzc7CgkKCUthdHRpbyBpbzsKCQoJaW50IG4sazsKCWludFtdIGEsYjsKCWludFtdIGY7CglMb25nW11bXSBkcDsKCQoJTG9uZ1tdIG1lbW9XYXlzVG9QYWlyOwoJCglTb2x2ZShLYXR0aW8gaW8pIHsKCQl0aGlzLmlvID0gaW87Cgl9CgoJTG9uZyB3YXlzVG9QYWlyKGludCB4KQoJewoJCWlmICghbWVtb1dheXNUb1BhaXJbeF0uZXF1YWxzKG5ldyBMb25nKCItMSIpKSkgCgkJCXJldHVybiBtZW1vV2F5c1RvUGFpclt4XTsKCQkKCQlpZiAoeCUyPT0xKSAKCQkJbWVtb1dheXNUb1BhaXJbeF09bmV3IExvbmcoMCk7CgkJZWxzZQoJCWlmICh4PT0wKQoJCQltZW1vV2F5c1RvUGFpclt4XT1uZXcgTG9uZygxKTsKCQllbHNlCgkJCW1lbW9XYXlzVG9QYWlyW3hdPXdheXNUb1BhaXIoeC0yKSooeC0xKSVtb2Q7CgkJCgkJLy9pby5wcmludGxuKHgrIiAiK21lbW9XYXlzVG9QYWlyW3hdKTsKCQlyZXR1cm4gbWVtb1dheXNUb1BhaXJbeF07Cgl9CgkKCWludCBwYWlyZWQoaW50IHgsaW50IHkpCgl7CgkJLy9pby5wcmludGxuKHgrIiAiK3krIiAiKygoZlt5XS1mW3gtMV0pPih5LXgrMSkpKTsKCQlyZXR1cm4gZlt5XS1mW3gtMV07Cgl9CgkKCWJvb2xlYW4gaW5zaWRlKGludCBhLGludCB4LGludCB5KQoJewoJCXJldHVybiAoeDw9YSAmJiBhPD15KTsKCX0KCQoJTG9uZyBjYWxkcChpbnQgeCxpbnQgeSkKCXsKCQlpZiAoIWRwW3hdW3ldLmVxdWFscyhuZXcgTG9uZygiLTEiKSkpIHJldHVybiBkcFt4XVt5XTsKCQkKCQlpbnQgbm90UGFpcmVkaW5YWSA9ICh5LXgrMSktcGFpcmVkKHgseSk7CgkJCgkJLy9pby5wcmludGxuKG5vdFBhaXJlZE91dFNpZGVYWTwwKTsKCQkKCQlmb3IgKGludCBpPTE7IGk8PWs7IGkrKykKCQl7CgkJCWJvb2xlYW4gcDEgPSBpbnNpZGUoYVtpXSx4LHkpOwoJCQlib29sZWFuIHAyID0gaW5zaWRlKGJbaV0seCx5KTsKCQkJaWYgKHAxIT1wMikKCQkJewoJCQkJZHBbeF1beV09bmV3IExvbmcoMCk7CgkJCQlyZXR1cm4gZHBbeF1beV07CgkJCX0KCQl9CgkJCgkJZHBbeF1beV09d2F5c1RvUGFpcihub3RQYWlyZWRpblhZKTsKCQkKCQkvL2lvLnByaW50bG4oeCsiICIreSsiICIrZHBbeF1beV0pOwoJCQoJCWZvciAoaW50IHo9eCsxOyB6PHk7IHorKykKCQl7CgkJCWludCBub3RQYWlyZWRpblpZID0gKHktKHorMSkrMSktcGFpcmVkKHorMSx5KTsKCQkJZHBbeF1beV09KGRwW3hdW3ldLWNhbGRwKHgseikqd2F5c1RvUGFpcihub3RQYWlyZWRpblpZKSttb2QqbW9kKSVtb2Q7CgkJfQoJCQoJCS8vaW8ucHJpbnRsbih4KyIgIit5KyIgIitkcFt4XVt5XSk7CgkJCgkJcmV0dXJuIGRwW3hdW3ldOwoJCQoJfQoJdm9pZCBtYWluKCkgewoJCS8vaW8ucHJpbnRsbihtb2QpOwoJCW49aW8uZ2V0SW50KCk7CgkJbio9MjsKCQlrPWlvLmdldEludCgpOwoJCWEgPSBuZXcgaW50W2srMV07CgkJYiA9IG5ldyBpbnRbaysxXTsKCQlmID0gbmV3IGludFtuKzFdOwoJCQoJCUFycmF5cy5maWxsKGYsIDApOwoJCQoJCWZvciAoaW50IGk9MTsgaTw9azsgaSsrKQoJCXsKCQkJYVtpXSA9IGlvLmdldEludCgpOwoJCQliW2ldID0gaW8uZ2V0SW50KCk7CgkJCWZbYVtpXV09MTsKCQkJZltiW2ldXT0xOwoJCX0KCQkKCQlmb3IgKGludCBpPTE7IGk8PW47IGkrKykKCQkJZltpXSs9ZltpLTFdOwoJCQoJCWRwID0gbmV3IExvbmdbbisxXVtuKzFdOwoJCQoJCWZvciAoaW50IGk9MDsgaTw9bjsgaSsrKQoJCQlBcnJheXMuZmlsbChkcFtpXSwgbmV3IExvbmcoIi0xIikpOwoJCQoJCW1lbW9XYXlzVG9QYWlyID0gbmV3IExvbmdbbisxXTsKCQlBcnJheXMuZmlsbChtZW1vV2F5c1RvUGFpciwgbmV3IExvbmcoIi0xIikpOwoJCQoJCUxvbmcgcmVzID0gbmV3IExvbmcoMCk7CgkJZm9yIChpbnQgeD0xOyB4PD1uOyB4KyspCgkJCWZvciAoaW50IHk9eDsgeTw9bjsgeSsrKQoJCQl7CgkJCQlpbnQgbm90UGFpcmVkT3V0U2lkZVhZID0gKG4tKHkteCsxKSktKGZbbl0tcGFpcmVkKHgseSkpOwoJCQkJcmVzPShyZXMrY2FsZHAoeCx5KSp3YXlzVG9QYWlyKG5vdFBhaXJlZE91dFNpZGVYWSklbW9kKSVtb2Q7CgkJCX0KCQkKCQlpby5wcmludChyZXMpOwoJfQp9CgpjbGFzcyBLYXR0aW8gZXh0ZW5kcyBQcmludFdyaXRlciB7CglwdWJsaWMgS2F0dGlvKElucHV0U3RyZWFtIGkpIHsKCQlzdXBlcihuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oU3lzdGVtLm91dCkpOwoJCXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGkpKTsKCX0KCglwdWJsaWMgS2F0dGlvKElucHV0U3RyZWFtIGksIE91dHB1dFN0cmVhbSBvKSB7CgkJc3VwZXIobmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG8pKTsKCQlyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpKSk7Cgl9CgoJcHVibGljIGJvb2xlYW4gaGFzTW9yZVRva2VucygpIHsKCQlyZXR1cm4gcGVla1Rva2VuKCkgIT0gbnVsbDsKCX0KCglwdWJsaWMgaW50IGdldEludCgpIHsKCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChuZXh0VG9rZW4oKSk7Cgl9CgoJcHVibGljIGRvdWJsZSBnZXREb3VibGUoKSB7CgkJcmV0dXJuIERvdWJsZS5wYXJzZURvdWJsZShuZXh0VG9rZW4oKSk7Cgl9CgoJcHVibGljIGxvbmcgZ2V0TG9uZygpIHsKCQlyZXR1cm4gTG9uZy5wYXJzZUxvbmcobmV4dFRva2VuKCkpOwoJfQoKCXB1YmxpYyBTdHJpbmcgZ2V0V29yZCgpIHsKCQlyZXR1cm4gbmV4dFRva2VuKCk7Cgl9CgoJcHJpdmF0ZSBCdWZmZXJlZFJlYWRlciByOwoJcHJpdmF0ZSBTdHJpbmcgbGluZTsKCXByaXZhdGUgU3RyaW5nVG9rZW5pemVyIHN0OwoJcHJpdmF0ZSBTdHJpbmcgdG9rZW47CgoJcHJpdmF0ZSBTdHJpbmcgcGVla1Rva2VuKCkgewoJCWlmICh0b2tlbiA9PSBudWxsKQoJCQl0cnkgewoJCQkJd2hpbGUgKHN0ID09IG51bGwgfHwgIXN0Lmhhc01vcmVUb2tlbnMoKSkgewoJCQkJCWxpbmUgPSByLnJlYWRMaW5lKCk7CgkJCQkJaWYgKGxpbmUgPT0gbnVsbCkKCQkJCQkJcmV0dXJuIG51bGw7CgkJCQkJc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGxpbmUpOwoJCQkJfQoJCQkJdG9rZW4gPSBzdC5uZXh0VG9rZW4oKTsKCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewoJCQl9CgkJcmV0dXJuIHRva2VuOwoJfQoKCXByaXZhdGUgU3RyaW5nIG5leHRUb2tlbigpIHsKCQlTdHJpbmcgYW5zID0gcGVla1Rva2VuKCk7CgkJdG9rZW4gPSBudWxsOwoJCXJldHVybiBhbnM7Cgl9Cn0=