#include #include #include #include using namespace std; const int dx[]={0, 1, 0}, dy[]={0, 0, 1}; const int mod = 1e9+7; const int MAX = 200010; class mint { long long x; public: mint(long long x=0) : x((x%mod+mod)%mod) {} mint operator-() const { return mint(-x); } mint& operator+=(const mint& a) { if ((x += a.x) >= mod) x -= mod; return *this; } mint& operator-=(const mint& a) { if ((x += mod-a.x) >= mod) x -= mod; return *this; } mint& operator*=(const mint& a) { (x *= a.x) %= mod; return *this; } mint operator+(const mint& a) const { mint res(*this); return res+=a; } mint operator-(const mint& a) const { mint res(*this); return res-=a; } mint operator*(const mint& a) const { mint res(*this); return res*=a; } mint pow(long long t) const { if (!t) return 1; mint a = pow(t>>1); a *= a; if (t&1) a *= *this; return a; } mint inv() const { return pow(mod-2); } mint& operator/=(const mint& a) { return (*this) *= a.inv(); } mint operator/(const mint& a) const { mint res(*this); return res/=a; } friend ostream& operator<<(ostream& os, const mint& m){ os << m.x; return os; } }; vector fact(MAX), finv(MAX); void init_nCr() { fact[0] = 1; for (int i = 1; i < MAX; i++) { fact[i] = fact[i - 1] * i; } finv[MAX - 1] = fact[MAX - 1].inv(); for (int i = MAX - 1; i > 0; i--) { finv[i - 1] = finv[i] * i; } return; } mint combi(int n, int k) { if (n < k || n < 0 || k < 0) return 0; return fact[n] * finv[k] * finv[n - k]; } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); init_nCr(); int N, M; cin>>N>>M; mint ans = combi(2*N, N)*2*N; for (int i=0;i>t>>x>>y; int nx=x+dx[t], ny=y+dy[t]; ans -= combi(x+y, x)*combi(2*N-nx-ny, N-nx); } cout << ans << "\n"; return 0; }