//const int N = 301;
//int ban[4][N][N];
//int dp[N][N][N];
//void _(){
//    int n,m;
//    cin >> n >> m;
//    while(m--){
//        int l,r,x;
//        cin >> l >> r >> x;
//        rep(i,1,3)
//            if(x != i) ban[i][l][r] = true;
//    }
//    rep(t,1,3)
//        rep(i,1,n)
//            rep(j,1,n)
//                ban[t][i][j] += ban[t][i-1][j];
//    dp[0][0][0] = 1;
//    rep(i,0,n-1)
//        rep(j,0,n-1)
//            rep(k,0,n-1){
//                if(dp[i][j][k] == 0) continue;
//                int r = max({i,j,k})+1;
//                rep(nxt,0,2){
//                    int o1,o2;
//                    if(nxt == 0) o1 = j, o2 = k;
//                    if(nxt == 1) o1 = i, o2 = k;
//                    if(nxt == 2) o1 = i, o2 = j;
//                    if(o1 > o2) swap(o1,o2);
//                    if(ban[3][o1][r]) continue;
//                    if(ban[2][o2][r]-ban[2][o1][r]) continue;
//                    if(ban[1][r][r]-ban[1][o2][r]) continue;
//                    if(nxt == 0) dp[r][j][k] += dp[i][j][k];
//                    if(nxt == 1) dp[i][r][k] += dp[i][j][k];
//                    if(nxt == 2) dp[i][j][r] += dp[i][j][k];
//                }
//                if(dp[r][j][k] >= MOD) dp[r][j][k] -= MOD;
//                if(dp[i][r][k] >= MOD) dp[i][r][k] -= MOD;
//                if(dp[i][j][r] >= MOD) dp[i][j][r] -= MOD;
//            }
//    ll ans = 0;
//    rep(i,0,n)
//        rep(j,0,n)
//            rep(k,0,n)
//                if(max({i,j,k}) == n)
//                    ans += dp[i][j][k];
//    ans %= MOD;
//    print(ans);
//}
//
#include <iomanip>
#include <algorithm>
#include <cassert>
#include <vector>
#include <utility>
#include <iostream>
#include <string>
#define REP_INT(i,l,r) for(int i = l; i <= r; ++i)
#define GET_REP_MACRO(_1,_2,_3,_4,NAME,...) NAME
#define rep(...) GET_REP_MACRO(__VA_ARGS__,REP_ANY,REP_INT)(__VA_ARGS__)
#define all(v) (v).begin(), (v).end()
#define T1 template<typename T> static
using namespace std;
typedef long long ll;
const ll MOD = 1e9 + 7;
T1 ostream& operator<<(ostream& stream, const vector<T>& t);
T1 istream& read(T, T, istream& = cin);
T1 void print(T x, string end = "\n"){
    cout << x << end;
}
const int N = 301;
int ban[4][N][N];
int dp[N][N][N];
void _(){
    int n,m;
    cin >> n >> m;
    while(m--){
        int l,r,x;
        cin >> l >> r >> x;
        rep(i,1,3)
            if(x != i) ban[i][l][r] = true;
    }
    rep(t,1,3)
        rep(i,1,n)
            rep(j,1,n)
                ban[t][i][j] += ban[t][i-1][j];
    dp[0][0][0] = 1;
    rep(i,0,n-1)
        rep(j,0,n-1)
            rep(k,0,n-1){
                if(dp[i][j][k] == 0) continue;
                int r = max({i,j,k})+1;
                rep(nxt,0,2){
                    int o1,o2;
                    if(nxt == 0) o1 = j, o2 = k;
                    if(nxt == 1) o1 = i, o2 = k;
                    if(nxt == 2) o1 = i, o2 = j;
                    if(o1 > o2) swap(o1,o2);
                    if(ban[3][o1][r]) continue;
                    if(ban[2][o2][r]-ban[2][o1][r]) continue;
                    if(ban[1][r][r]-ban[1][o2][r]) continue;
                    if(nxt == 0) dp[r][j][k] += dp[i][j][k];
                    if(nxt == 1) dp[i][r][k] += dp[i][j][k];
                    if(nxt == 2) dp[i][j][r] += dp[i][j][k];
                }
                if(dp[r][j][k] >= MOD) dp[r][j][k] -= MOD;
                if(dp[i][r][k] >= MOD) dp[i][r][k] -= MOD;
                if(dp[i][j][r] >= MOD) dp[i][j][r] -= MOD;
            }
    ll ans = 0;
    rep(i,0,n)
        rep(j,0,n)
            rep(k,0,n)
                if(max({i,j,k}) == n)
                    ans += dp[i][j][k];
    ans %= MOD;
    print(ans);
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout << fixed << setprecision(15);
        _();
}


Measured memory_bytes: 107904