from functools import reduce
import math
import collections

def main():
    # 文字列の2進数を数値にする
    # '101' → '5'
    # 文字列の頭に'0b'をつけてint()にわたす
    # binary = int('0b'+'101',0)

    # 2進数で立っているbitを数える
    # 101(0x5) → 2
    # cnt_bit = bin(5).count('1')
    
    # N! を求める
    # f = math.factorial(N)

    # N の逆元
    # N_inv = pow(N,MOD-2,MOD)

    # nCr
    # Nの階乗 * rの階乗の逆元 * n-rの階乗の逆元
    
    # 切り捨て
    # 4 // 3
    # 切り上げ
    #-(-4 // 3)
    
    # 初期値用:十分大きい数(100億)
    INF = float("inf")

    # 大きな素数
    MOD = 10**9+7
    
    # 1文字のみを読み込み
    # 入力:2
    # a = input().rstrip()
    # 変数:a='2'
    
    # スペース区切りで標準入力を配列として読み込み
    # 入力:2 4 5 7
    # a, b, c, d = (int(_) for _ in input().split())  
    # 変数:a=2 b=4 c=5 d =7
    
    # 1文字ずつ標準入力を配列として読み込み
    # 入力:2 4 5 7
    # a = list(int(_) for _ in input().split())
    # 変数:a = [2, 4, 5, 7]    

    # 1文字ずつ標準入力を配列として読み込み
    # 入力:2457
    # a = list(int(_) for _ in input())
    # 変数:a = [2, 4, 5, 7]
    N_max = 10005
    N, C = (int(_) for _ in input().split())
    s = []
    t = []
    c = []
    for i in range(N):
        s1, s2,s3 = (int(_) for _ in input().split())
        s.append(s1)
        t.append(s2)
        c.append(s3)
        
    d = []
    d.append([0]*N_max)
    for i in range(N):
        for d_i in range(len(d)):
            can_insert_channel = True
            for d_j in range(s[i],t[i]+1):
                if d_j == s[i]:
                    if d[d_i][d_j] == c[i] or d[d_i][d_j] == 0:
                        continue
                    else:
                        can_insert_channel = False
                        break
                if d[d_i][d_j] != 0:
                    can_insert_channel = False
                    break
                
            if can_insert_channel:
                for j in range(s[i],t[i]+1):
                    d[d_i][j] = c[i]
                break
            elif d_i == len(d)-1:
                d.append([0]*N_max)
                for j in range(s[i],t[i]+1):                    
                    d[d_i+1][j]= c[i]
    for i in range(len(d)):
        print(list(d[i]))
    print(len(d))
    
if __name__ == '__main__':
    main()


### FIXED CODE ###

from functools import reduce
import math
import collections

def main():
    # 文字列の2進数を数値にする
    # '101' → '5'
    # 文字列の頭に'0b'をつけてint()にわたす
    # binary = int('0b'+'101',0)

    # 2進数で立っているbitを数える
    # 101(0x5) → 2
    # cnt_bit = bin(5).count('1')
    
    # N! を求める
    # f = math.factorial(N)

    # N の逆元
    # N_inv = pow(N,MOD-2,MOD)

    # nCr
    # Nの階乗 * rの階乗の逆元 * n-rの階乗の逆元
    
    # 切り捨て
    # 4 // 3
    # 切り上げ
    #-(-4 // 3)
    
    # 初期値用:十分大きい数(100億)
    INF = float("inf")

    # 大きな素数
    MOD = 10**9+7
    
    # 1文字のみを読み込み
    # 入力:2
    # a = input().rstrip()
    # 変数:a='2'
    
    # スペース区切りで標準入力を配列として読み込み
    # 入力:2 4 5 7
    # a, b, c, d = (int(_) for _ in input().split())  
    # 変数:a=2 b=4 c=5 d =7
    
    # 1文字ずつ標準入力を配列として読み込み
    # 入力:2 4 5 7
    # a = list(int(_) for _ in input().split())
    # 変数:a = [2, 4, 5, 7]    

    # 1文字ずつ標準入力を配列として読み込み
    # 入力:2457
    # a = list(int(_) for _ in input())
    # 変数:a = [2, 4, 5, 7]
    N_max = 100005
    N, C = (int(_) for _ in input().split())
    s = []
    t = []
    c = []
    for i in range(N):
        s1, s2,s3 = (int(_) for _ in input().split())
        s.append(s1)
        t.append(s2)
        c.append(s3)
        
    d = [[0 for j in range(C)] for i in range(N_max)]
    for i in range(N):
        for j in range(s[i]-1,t[i]):
            d[j][c[i]-1] = 1
    ans = 0
    for i in range(N_max):
        ans = max(sum(d[i]),ans)
    print(ans)
    # for i in range(N):
    #     for d_i in range(len(d)):
    #         can_insert_channel = True
    #         for d_j in range(s[i],t[i]+1):
    #             if d_j == s[i]:
    #                 if d[d_i][d_j] == c[i] or d[d_i][d_j] == 0:
    #                     continue
    #                 else:
    #                     can_insert_channel = False
    #                     break
    #             if d[d_i][d_j] != 0:
    #                 can_insert_channel = False
    #                 break
                
    #         if can_insert_channel:
    #             for j in range(s[i],t[i]+1):
    #                 d[d_i][j] = c[i]
    #             break
    #         elif d_i == len(d)-1:
    #             d.append([0]*N_max)
    #             for j in range(s[i],t[i]+1):                    
    #                 d[d_i+1][j]= c[i]
    # for i in range(len(d)):
    #     print(list(d[i]))
    # print(len(d))
    
if __name__ == '__main__':
    main()