#include const int N = 200010; const int moder = int(1e9) + 7; int l[N], r[N], p[N]; int cnt[N], zeroid[N], oneid[N]; int right[N], left[N]; int zeroleft[N]; int dp[N][2], pre1[N][2], pre2[N][2]; int power[N], invpower[N]; int fa[N * 2]; int powermod(int a, int exp){ int ret = 1; for ( ; exp > 0; exp >>= 1){ if (exp & 1){ ret = 1ll * ret * a % moder; } a = 1ll * a * a % moder; } return ret; } int find(int u){ return fa[u] == u ? u : (fa[u] = find(fa[u])); } void unite(int u, int v){ u = find(u), v = find(v); if (u == v){ return; } fa[u] = v; } int main(){ int n, m; scanf("%d%d", &n, &m); for (int i = 0; i < m; ++ i){ scanf("%d%d%d", &l[i], &r[i], &p[i]); if (p[i]){ ++ cnt[l[i]]; -- cnt[r[i] + 1]; } } for (int i = 1; i <= n; ++ i){ cnt[i] += cnt[i - 1]; } int id = 0; for (int i = 1; i <= n; ++ i){ if (!cnt[i]){ zeroid[i] = ++ id; } } for (int i = n; i >= 1; -- i){ right[i] = cnt[i] == 0 ? zeroid[i] : right[i + 1]; } for (int i = 1; i <= n; ++ i){ left[i] = cnt[i] == 0 ? zeroid[i] : left[i - 1]; } for (int i = 0; i < m; ++ i){ if (!p[i]){ int ll = right[l[i]]; int rr = left[r[i]]; if (ll == 0 || rr == 0 || ll > rr){ puts("0"); return 0; } zeroleft[rr] = ll; } } int max = 0; for (int i = 1; i <= id; ++ i){ if (zeroleft[i] <= max){ zeroleft[i] = 0; } max = std::max(max, zeroleft[i]); } power[0] = 1, power[1] = 2ll * powermod(3, moder - 2) % moder; invpower[0] = 1, invpower[1] = 3ll * powermod(2, moder - 2) % moder; for (int i = 2; i < N; ++ i){ power[i] = 1ll * power[i - 1] * power[1] % moder; invpower[i] = 1ll * invpower[i - 1] * invpower[1] % moder; } dp[0][0] = pre1[0][0] = pre2[0][0] = 1; for (int i = 1; i <= id; ++ i){ if (zeroleft[i]){ int len = i - zeroleft[i] + 1; for (int j = 0; j < 2; ++ j){ dp[i][j] = 1ll * pre1[zeroleft[i] - 1][j ^ 1] * power[len] % moder; dp[i][j] = (dp[i][j] + 1ll * (pre2[i - 1][j ^ 1] - pre2[zeroleft[i] - 1][j ^ 1]) * power[i]) % moder; dp[i][j] += dp[i][j] < 0 ? moder : 0; } } for (int j = 0; j < 2; ++ j){ pre1[i][j] = (pre1[i - 1][j] + dp[i][j]) % moder; pre2[i][j] = (pre2[i - 1][j] + 1ll * invpower[i] * dp[i][j]) % moder; } } int ans = (1ll * (pre1[id][0] - pre1[id][1]) * powermod(3, id)) % moder; ans += ans < 0 ? moder : 0; id = 0; for (int i = 1; i <= n; ++ i){ if (cnt[i]){ oneid[i] = ++ id; } } for (int i = 0; i < 2 * N; ++ i){ fa[i] = i; } int nn = n; n = id + 1; for (int i = 0; i < m; ++ i){ if (!p[i]){ continue; } l[i] = oneid[l[i]]; r[i] = oneid[r[i]]; if (p[i] == 1){ if (find(l[i] - 1) == find(r[i] + n)){ puts("0"); return 0; } unite(l[i] - 1, r[i]); unite(l[i] - 1 + n, r[i] + n); } else if (p[i] == -1){ if (find(l[i] - 1) == find(r[i])){ puts("0"); return 0; } unite(l[i] - 1, r[i] + n); unite(l[i] - 1 + n, r[i]); } } int ccnt = 0; for (int i = 0; i < 2 * n; ++ i){ if (find(i) == i){ ++ ccnt; } } ccnt /= 2; -- ccnt; ans = 1ll * ans * powermod(2, ccnt) % moder; printf("%d\n", ans); return 0; }