import heapq import sys mod = 10**9+7 class BIT(): def __init__(self,n): self.BIT=[0]*(n+1) self.num=n def query(self,idx): res_sum = 0 while idx > 0: res_sum += self.BIT[idx] idx -= idx&(-idx) return res_sum #Ai += x O(logN) def update(self,idx,x): while idx <= self.num: self.BIT[idx] += x idx += idx&(-idx) return input = sys.stdin.readline N,M = map(int,input().split()) cond = [None for i in range(N+1)] for _ in range(M): l,r,p = map(int,input().split()) cond[r] = (l,p) left = [N+1 for i in range(N+1)] pos = -1 for i in range(1,N+1): if cond[i]: l,p = cond[i] if p == 0: for j in range(pos+1,l): left[j] = i pos = max(l-1,pos) right = [N+1 for i in range(N+1)] que = [] query = [] for i in range(1,N+1): query.append((i,10**9)) if cond[i] and cond[i][1] != 0: query.append((cond[i][0],i)) query.append((i,-i)) query.sort() erase = [False]*(N+1) for a,b in query: if b<0: erase[-b] = True elif b==10**9: while que and erase[que[0]]: heapq.heappop(que) if que: right[a] = que[0] else: heapq.heappush(que,b) erase = [[] for i in range(N+1)] for i in range(N+1): if min(left[i],right[i])!=N+1: t = min(left[i],right[i]) erase[t].append(i) bit = BIT(N+1) dp = [0 for i in range(N+1)] dp[0] = 1 S = 1 for i in range(1,N+1): #print(S) if cond[i]: l,p = cond[i] if p==0: dp[i] = S for v in erase[i]: S -= dp[v] * pow(2,bit.query(v+1),mod) S %= mod bit.update(l+1,1) bit.update(i+1,-1) S = (2*S + dp[i]) % mod else: for v in erase[i]: S -= dp[v] * pow(2,bit.query(v+1),mod) S %= mod else: dp[i] = S S *= 3 S %= mod bit.update(1,1) bit.update(i+1,-1) print(S)