#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define all(x) (x).begin(),(x).end()
const int mod=1000000007,MAX=305,INF=1<<30;
ll dp[MAX][MAX][MAX];

struct query{
    int l;
    int r;
    int c;
};

int main(){
    
    std::ifstream in("text.txt");
    std::cin.rdbuf(in.rdbuf());
    cin.tie(0);
    ios::sync_with_stdio(false);
    
    int N,M;cin>>N>>M;
    vector<query> S(M);
    for(int i=0;i<M;i++){
        cin>>S[i].l>>S[i].r>>S[i].c;
    }
    sort(all(S),[](query a,query b){
        return a.r<b.r;
    });
    
    dp[1][0][0]=1;
    dp[0][1][0]=1;
    dp[0][0][1]=1;
    
    int id=0;
    
    while(id<M&&S[id].r==1){
        if(S[id].c>=2){
            cout<<0<<endl;
            return 0;
        }
        id++;
    }
    
    for(int t=1;t<N;t++){
        for(int j=0;j<t;j++){
            for(int k=0;k<t;k++){
                dp[t+1][j][k]+=dp[t][j][k];
                dp[t][t+1][k]+=dp[t][j][k];
                dp[t][j][t+1]+=dp[t][j][k];
            }
        }
        
        for(int i=0;i<t;i++){
            for(int k=0;k<t;k++){
                dp[t+1][t][k]+=dp[i][t][k];
                dp[i][t+1][k]+=dp[i][t][k];
                dp[i][t][t+1]+=dp[i][t][k];
            }
        }
        
        for(int i=0;i<t;i++){
            for(int j=0;j<t;j++){
                dp[t+1][j][t]+=dp[i][j][t];
                dp[i][t+1][t]+=dp[i][j][t];
                dp[i][j][t+1]+=dp[i][j][t];
            }
        }
        int sid=id;
        
        for(int j=0;j<=t;j++){
            for(int k=0;k<=t;k++){
                id=sid;
                dp[t+1][j][k]%=mod;
                while(id<M&&S[id].r==t+1){
                    int cnt=1;
                    if(j>=S[id].l) cnt++;
                    if(k>=S[id].l) cnt++;
                    
                    if(cnt!=S[id].c) dp[t+1][j][k]=0;
                    
                    id++;
                }
            }
        }
        
        for(int i=0;i<=t;i++){
            for(int k=0;k<=t;k++){
                id=sid;
                dp[i][t+1][k]%=mod;
                while(id<M&&S[id].r==t+1){
                    int cnt=1;
                    if(i>=S[id].l) cnt++;
                    if(k>=S[id].l) cnt++;
                    
                    if(cnt!=S[id].c) dp[i][t+1][k]=0;
                    
                    id++;
                }
            }
        }
        
        for(int i=0;i<=t;i++){
            for(int j=0;j<=t;j++){
                id=sid;
                dp[i][j][t+1]%=mod;
                while(id<M&&S[id].r==t+1){
                    int cnt=1;
                    if(i>=S[id].l) cnt++;
                    if(j>=S[id].l) cnt++;
                    
                    if(cnt!=S[id].c) dp[i][j][t+1]=0;
                    
                    id++;
                }
            }
        }
    }
    
    ll ans=0;
    
    int t=N;
    
    for(int j=0;j<t;j++){
        for(int k=0;k<t;k++){
            ans+=dp[N][j][k];
            ans%=mod;
        }
    }
    
    for(int i=0;i<t;i++){
        for(int k=0;k<t;k++){
            ans+=dp[i][N][k];
            ans%=mod;
        }
    }
    
    for(int i=0;i<t;i++){
        for(int j=0;j<t;j++){
            ans+=dp[i][j][N];
            ans%=mod;
        }
    }
    
    cout<<ans<<endl;
}


Measured memory_bytes: 219392