Problem: 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.

Examples

Input

3 1
1 3 3


Output

6


Input

4 2
1 3 1
2 4 2


Output

6


Input

1 3
1 1 1
1 1 2
1 1 3


Output

0


Input

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


Output

108

Solution (in CPP):

Solution:
// AtCoder Regular Contest 074
// E - RGB Sequence

#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long int ll;
typedef pair<int, int> PII;

const int MAX_N = 300;
const int MAX_M = 300;
const ll MOD = 1e9 + 7;

int N, M;
ll dp[MAX_N + 1][MAX_N + 1][MAX_N + 1];
vector<PII> rules[MAX_N + 1];

ll f(int a, int b, int c) {
  int pos = max(max(a, b), c);
  if (dp[a][b][c] != -1) {
    return dp[a][b][c];
  }
  vector<int> w = {a, b, c};
  sort(w.begin(), w.end());
  for (PII &rule: rules[pos]) {
    for (int i = 0; i < 3; i++) {
      if (rule.first <= w[i]) {
        if (rule.second != 3 - i) {
          dp[a][b][c] = 0;
          return 0;
        }
        break;
      }
    }
  }
  if (pos == N) {
    dp[a][b][c] = 1;
    return 1;
  }
  dp[a][b][c] = (f(pos + 1, b, c) + f(a, pos + 1, c) + f(a, b, pos + 1)) % MOD;
  return dp[a][b][c];
}

int main() {

  int l, r, x;

  cin >> N >> M;
  for (int i = 0; i < M; i++) {
    cin >> l >> r >> x;
    rules[r].push_back(PII(l, x));
  }
  memset(dp, -1, sizeof(dp));

  cout << f(0, 0, 0) << endl;

  return 0;

}