#include <bits/stdc++.h>
#define cerr cout << "in " << __LINE__ << "\t: "
using namespace std;
const int mod = 998244353;
struct mint {
int x;
mint() : x(0) {}
mint(long long y, bool flag = 0) {
if (flag) x = y;
else x = (y % mod + mod) % mod;
}
friend const mint ksm(mint a, long long b);
const mint inv() {return ksm(*this, mod - 2);}
};
bool operator == (const mint a, const mint b) {return a.x == b.x;}
bool operator != (const mint a, const mint b) {return a.x != b.x;}
bool operator < (const mint a, const mint b) {return a.x < b.x;}
int operator ! (const mint a) {return !a.x;}
const mint operator + (const mint a, const mint b) {
mint res(a.x + b.x, 1);
if (res.x >= mod) res.x -= mod;
return res;
}
mint& operator += (mint &a, const mint b) {
a.x += b.x;
if (a.x >= mod) a.x -= mod;
return a;
}
const mint operator - (const mint a, const mint b) {
mint res(a.x - b.x, 1);
if (res.x < 0) res.x += mod;
return res;
}
mint& operator -= (mint &a, const mint b) {
a.x -= b.x;
if (a.x < 0) a.x += mod;
return a;
}
const mint operator * (const mint a, const mint b) {
return mint((long long)a.x * b.x % mod, 1);
}
mint& operator *= (mint &a, const mint b) {
a.x = (long long)a.x * b.x % mod;
return a;
}
const mint ksm(mint a, long long b) {
mint res(1, 1);
for (; b; a *= a, b >>= 1)
if (b & 1) res *= a;
return res;
}
const mint operator / (const mint a, const mint b) {
return a * ksm(b, mod - 2);
}
mint& operator /= (mint &a, const mint b) {
a = a * ksm(b, mod - 2);
return a;
}
ostream& operator << (ostream &out, const mint a) {
return out << a.x;
}
istream& operator >> (istream &in, mint &a) {
long long y;
in >> y, a = mint(y);
return in;
}
const int MAXV = 1000;
mint inv[MAXV + 10], jc[MAXV + 10], invjc[MAXV + 10];
struct comb_init {
comb_init() {
jc[0] = 1;
for (int i = 1; i <= MAXV; i++)
jc[i] = jc[i - 1] * i;
invjc[MAXV] = jc[MAXV].inv();
for (int i = MAXV; i > 0; i--)
invjc[i - 1] = invjc[i] * i;
for (int i = 1; i <= MAXV; i++)
inv[i] = jc[i - 1] * invjc[i];
}
} comb_init;
mint C(int x, int y) {
if (y < 0 || x < y) return 0;
return jc[x] * invjc[y] * invjc[x - y];
}
int n, m, a[510][510][510];
mint f[510][510];
signed main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int l, r, x;
cin >> l >> r >> x;
a[x][l][r] = 1;
}
for (int i = 1; i <= n; i++)
for (int len = 2; len <= n; len++)
for (int l = 1, r = len; r <= n; l++, r++)
a[i][l][r] |= a[i][l + 1][r] | a[i][l][r - 1];
for (int i = 0; i <= n; i++)
f[i + 1][i] = 1;
for (int len = 1; len <= n; len++)
for (int l = 1, r = len; r <= n; l++, r++) {
for (int k = l; k <= r; k++) {
if (a[k][l][r]) continue;
f[l][r] += f[l][k - 1] * f[k + 1][r] * C(r - l, k - l);
}
}
cout << f[1][n] << "\n";
return 0;
}