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)

                                            
  //File Name: arc074_C.cpp
  //Created Time: 2017年06月17日 星期六 18时25分11秒
                                   
#include <bits/stdc++.h>
#define LL long long
#define pii pair<int,int>
#define fir first
#define sec second
using namespace std;
const int MAXN = 303;
const int P = (int)1e9 + 7;
LL f[MAXN][MAXN][MAXN];
vector<pii> que[MAXN];
void add(LL &x,LL y){
	x += y;
	if(x >= P) x-= P;
}
bool check(int i,int j,int k){
	int ma = max(i,max(j,k));
	int mi = min(i,min(j,k));
	int mid(-1);
	if(mi < i && i < ma) mid = i;
	else if(mi < j && j < ma) mid = j;
	else if(mi < k && k < ma) mid = k;
	if(mid == -1) mid = 0;
	for(auto cur:que[ma]){
		int l = cur.fir;
		int x = cur.sec;
		if(x == 3 && l <= mi) continue;
		if(x == 2 && mi < l && l <= mid) continue;
		if(x == 1 && mid < l && l <= ma) continue;
		return false;
	}
	return true;
}
LL solve(const int n,const int m){
	f[0][0][0] = 1;
	for(int i(0);i<n;++i){
		for(int j(0);j<n;++j){
			if(j && j == i) continue;
			for(int k(0);k<n;++k){
				if(k && (k == i || k == j)) continue;
				if(!f[i][j][k]) continue;
				int nxt = max(i,max(j,k)) + 1;
				if(check(nxt,j,k)) 
					add(f[nxt][j][k],f[i][j][k]);
				if(check(i,nxt,k))
					add(f[i][nxt][k],f[i][j][k]);
				if(check(i,j,nxt))
					add(f[i][j][nxt],f[i][j][k]);
			}
		}
	}
	LL res(0);
	for(int i(0);i<n;++i){
		for(int j(0);j<n;++j){
			if(i == j) continue;
			LL tmp = f[i][j][n] + f[i][n][j] + f[n][i][j];
			tmp %= P;
			add(res,tmp);
		}
	}
	return res;
}
int main(){
	int n,m;
	scanf("%d %d",&n,&m);
	for(int i(1),l,r,x;i<=m;++i){
		scanf("%d %d %d",&l,&r,&x);
		que[r].push_back(pii(l,x));
	}
	printf("%lld\n",solve(n,m));
	return 0;
}