#include #pragma GCC optimize("Ofast") //#pragma GCC target("avx2") #pragma GCC optimize("unroll-loops") using namespace std; //#include //#include //namespace mp=boost::multiprecision; //#define mulint mp::cpp_int //#define mulfloat mp::cpp_dec_float_100 struct __INIT{__INIT(){cin.tie(0);ios::sync_with_stdio(false);cout<=0;(i)--) #define flc(x) __builtin_popcountll(x) #define pint pair #define pdouble pair #define plint pair #define fi first #define se second #define all(x) x.begin(),x.end() #define vec vector #define nep(x) next_permutation(all(x)) typedef long long lint; int dx[8]={1,1,0,-1,-1,-1,0,1}; int dy[8]={0,1,1,1,0,-1,-1,-1}; const int MAX_N=3e5+5; templatebool chmax(T &a,const T &b){if(abool chmin(T &a,const T &b){if(b bucket[MAX_N/1000]; constexpr int MOD=1000000007; //constexpr int MOD=998244353; /*#include using namespace atcoder; typedef __int128_t llint;*/ lint fac[510000],finv[510000],inv[510000]; void COMinit(){ fac[0]=fac[1]=1; finv[0]=finv[1]=1; inv[1]=1; for(int i=2;i<510000;i++){ fac[i]=fac[i-1]*i%MOD; inv[i]=MOD-inv[MOD%i]*(MOD/i)%MOD; finv[i]=finv[i-1]*inv[i]%MOD; } } lint COM(lint n,lint k){ if (nn-r;i--) ans=(ans*i)%MOD; return (ans*finv[r])%MOD; } // COMinit();でテーブル準備を行うこと int main(void){ COMinit(); lint N,M; cin >> N >> M; lint ans=COM(2*N,N)*N*2; ans%=MOD; lint minus=0; rep(i,M){ int t,x,y; cin >> t >> x >> y; int sx=x,sy=y,gx=x,gy=y; if(t==1){ gx++; minus+=(COM(sx+sy,sx)*COM(2*N-gx-gy,N-gx)); minus%=MOD; } else{ gy++; minus+=(COM(sx+sy,sx)*COM(2*N-gx-gy,N-gx)); minus%=MOD; } } cout << (ans-minus+MOD)%MOD << endl; }