Problem:
Score : 800 points

Problem Statement

There are N squares arranged in a row.
The squares are numbered 1, 2, ..., N, from left to right.

Snuke is painting each square in red, green or blue.
According to his aesthetic sense, the following M conditions must all be satisfied.
The i-th condition is:

There are exactly x_i different colors among squares l_i, l_i + 1, ..., r_i.

In how many ways can the squares be painted to satisfy all the conditions?
Find the count modulo 10^9+7.

Constraints

1 ≤ N ≤ 300

1 ≤ M ≤ 300

1 ≤ l_i ≤ r_i ≤ N

1 ≤ x_i ≤ 3

Input

Input is given from Standard Input in the following format:

N M
l_1 r_1 x_1
l_2 r_2 x_2
:
l_M r_M x_M

Output

Print the number of ways to paint the squares to satisfy all the conditions, modulo 10^9+7.

Sample Input 1

3 1
1 3 3

Sample Output 1

6

The six ways are:

RGB

RBG

GRB

GBR

BRG

BGR

where R, G and B correspond to red, green and blue squares, respectively.

Sample Input 2

4 2
1 3 1
2 4 2

Sample Output 2

6

The six ways are:

RRRG

RRRB

GGGR

GGGB

BBBR

BBBG

Sample Input 3

1 3
1 1 1
1 1 2
1 1 3

Sample Output 3

0

There are zero ways.

Sample Input 4

8 10
2 6 2
5 5 1
3 5 2
4 7 3
4 4 1
2 3 1
7 7 1
1 5 2
1 7 3
3 4 2

Sample Output 4

108

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<bits/stdc++.h>
using namespace std;
#define FOR(i,a,b) for (int i=(a);i<(b);i++)
#define RFOR(i,a,b) for (int i=(b)-1;i>=(a);i--)
#define REP(i,n) for (int i=0;i<(n);i++)
#define RREP(i,n) for (int i=(n)-1;i>=0;i--)
typedef long long LL;
LL MOD=10e9+7;
int N,M;
int l[401];
int r[401];
int x[401];
typedef pair<int,int> P;
vector<P>v;
int dp[401][401];
int dp2[401][401];
int main(){
    cin>>N>>M;
    REP(i,M){
        cin>>l[i]>>r[i]>>x[i];
        v.push_back(make_pair(r[i],i));
    }
    sort(v.begin(),v.end());
    REP(i,301){
        REP(j,301){
            dp[i][j]=0;
            dp2[i][j]=0;
        }
    }
    int count=0;
    while(v.size()>count&&v[count].first==1){
       if(x[v[count].second]!=1){
          cout<<0<<endl;
          return 0;
       }
       count++;
    }
    dp[0][0]=3;
    dp2[0][0]=3;
    for(int i=2;i<=N;i++){
        //iとi-1が同じ場合はすでに加算済み
        //iとi-1が違う場合
        REP(j,301){
            REP(k,301){
                dp2[i-1][j]+=dp[j][k];//kの方の色を入れた
                dp2[i-1][k]+=dp[j][k];//jの方の色を入れた
            }
        }
        //条件の確認
        while(v.size()>count&&v[count].first==i){
           //cout<<"aa"<<endl;
           int num=v[count].second;
           //1色
           if(x[num]==1){
              REP(j,301){
                  REP(k,301){
                      if(l[num]<=j|| l[num]<=k){
                         dp2[j][k]=0;
                      }
                  }
              }
           }
           if(x[num]==2){
              REP(j,301){
                  REP(k,301){
                      if(l[num]>j&& l[num]>k){
                         dp2[j][k]=0;
                      }
                      if(l[num]<=j&& l[num]<=k){
                         dp2[j][k]=0;
                      }
                  }
              }
           }
           if(x[num]==3){
              REP(j,301){
                  REP(k,301){
                      //cout<<"aaaaa"<<l[num]<<" "<<j<<" "<<k<<endl;
                      if((l[num]>j)|| (l[num]>k)){
                      //cout<<"bb"<<endl;
                         dp2[j][k]=0;
                      }
                  }
              }
           }
           count++;
        }
    
        REP(j,301){
            REP(k,301){
                dp2[j][k]=dp[j][k]%MOD;
                dp[j][k]=dp2[j][k];
            }
        }
        
        /*
        REP(j,5){
            REP(k,5){
               //cout<<j<<" "<<k<<"dp"<<dp[j][k]<<endl;
            }
        }
        cout<<endl;
        */
    }
    
    LL ans=0;
    
    REP(i,301){
        REP(j,301){
            if(i==0&&j==0){
               ans+=dp[i][j];
            }else{
               ans+=dp[i][j];
            }
            ans=ans%MOD;
        }
    }

    cout<<ans<<endl;
    return(0);
}