// code by lynmisakura. wish to be accepted! #include using namespace std; #define REP(i,N) for(int i = 0;i < N;i++) using ll = long long; #include using mint = atcoder::modint1000000007; namespace lyn{ struct Binom{ std::vector> C; Binom(int MAX_N){ C = std::vector>(MAX_N,std::vector(0)); for(int i = 0;i < MAX_N;i++)C[i].resize(MAX_N,0); for(int i = 1;i < MAX_N;i++){ for(int j = 1;j < MAX_N;j++){ C[i][j] = (j==0||j==i ? 1LL : C[i-1][j-1]+C[i-1][j]); } } } int64_t coef(int n,int k){ return C[n+1][k+1]; } }; const int BINOM_MAX = 1e6+10; struct Binom998244353{ using mint = atcoder::modint998244353; std::vector F,Finv; Binom998244353(){ F.assign(BINOM_MAX,1); Finv.assign(BINOM_MAX,1); for(int i = 2;i < BINOM_MAX;i++) F[i] = F[i-1] * mint(i); Finv[BINOM_MAX-1] = F[BINOM_MAX-1].inv(); for(int i = BINOM_MAX - 2;i >= 1;i--) Finv[i] = Finv[i+1] * mint(i+1); } mint coef(int n,int r){ if(n < 0 || r < 0 || n < r) return 0; else return F[n] * Finv[r] * Finv[n - r]; } }; struct Binom1000000007{ using mint = atcoder::modint1000000007; std::vector F,Finv; Binom1000000007(){ F.assign(BINOM_MAX,1); Finv.assign(BINOM_MAX,1); for(int i = 2;i < BINOM_MAX;i++) F[i] = F[i-1] * mint(i); Finv[BINOM_MAX-1] = F[BINOM_MAX-1].inv(); for(int i = BINOM_MAX - 2;i >= 1;i--) Finv[i] = Finv[i+1] * mint(i+1); } mint coef(int n,int r){ if(n < 0 || r < 0 || n < r) return 0; else return F[n] * Finv[r] * Finv[n - r]; } }; } int main(void){ cin.tie(0); ios::sync_with_stdio(false); cout << fixed << setprecision(15); int N,M; cin >> N >> M; lyn::Binom1000000007 B; mint ans = mint(2*N) * B.coef(2*N,N); REP(i,M){ int t,x,y; cin >> t >> x >> y; if(t == 1){ ans -= B.coef(x+y,x)*B.coef(N-y+(N-1-x),N-y); }else{ ans -= B.coef(x+y,x)*B.coef((N-1-y)+(N-x),N-x); } } cout << ans.val() << '\n'; }