#pragma GCC optimize("Ofast") #pragma GCC target("avx2") char*mmap(); #define rd_skip() while(*rp++>=48) #define rd(v) long v=0;{int _c;while(_c=*rp++-48,_c>=0)v=v*10+_c;} #define wt(v) {long _z=v;do*--wp=_z%10+48;while(_z/=10);} #define rep(v,e) for(long v=0;v<e;++v) #define MD 1000000007 #define M 400001 int fac[M],ifac[M]; int inverse(int a){ int b=MD; int u=1; int v=0; int s,t; while(b){ t=a/b; s=b; b=a-t*b; a=s; s=v; v=u-t*v; u=s; } if(u<0){ u+=MD; } return u; } void mkfac(){ long x=1; fac[0]=x; for(long i=1;i<M;i++){ x=x*i%MD; fac[i]=x; } x=inverse(x); for(long i=M;i--;){ ifac[i]=x; x=x*i%MD; } } static inline long f(long a,long b){ return (long)fac[a+b]*(long)ifac[a]%MD*(long)ifac[b]%MD; } main(){ mkfac(); char*rp=mmap(0l,1l<<25,1,2,0,0ll); rd(n); rd_skip(); long r=0; while(*rp){ long t=*rp; rp+=2; rd(x); rd(y); if(t&1){ r+=f(x,y)*f(n-x-1,n-y)%MD; }else{ r+=f(x,y)*f(n-x,n-y-1)%MD; } } r=(f(n,n)*n*2-r)%MD; r+=r<0?MD:0; char wbuf[64],*wp=wbuf+sizeof wbuf; wt(r); write(1,wp,wbuf+sizeof wbuf-wp); _exit(0); }