#include <bits/stdc++.h>
using namespace std;
int gi() {
  int a;
  scanf("%d", &a);
  return a;
}
long long gli() {
  long long a;
  scanf("%I64d", &a);
  return a;
}
long long m[3][16][16];
long long r[16];
long long r2[16];
void mult(int a, int b, int c, int n) {
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) {
      long long t = 0;
      for (int k = 0; k < n; k++) {
        t += (m[a][i][k] * m[b][k][j]) % 1000000007;
        t %= 1000000007;
      }
      m[c][i][j] = t;
    }
}
int mkm(int n, long long p) {
  if (p == 0) {
    for (int i = 0; i < n; i++)
      for (int j = 0; j < n; j++) m[1][i][j] = (i == j ? 1 : 0);
    return 1;
  }
  int w = mkm(n, p / 2);
  mult(w, w, 3 - w, n);
  if (p % 2) {
    mult(0, 3 - w, w, n);
    return w;
  }
  return 3 - w;
}
int main() {
  for (int i = 0; i < 16; i++)
    for (int j = 0; j < 16; j++) m[0][i][j] = (i - j < 2 && j - i < 2 ? 1 : 0);
  int n = gi();
  long long k = gli();
  memset(r, 0, sizeof(r));
  r[0] = 1;
  for (int i = 0; i < n; i++) {
    long long a = gli();
    long long b = gli();
    int c = gi() + 1;
    if (i == n - 1) b = k;
    int w = mkm(c, b - a);
    for (int j = 0; j < 16; j++) {
      long long t = 0;
      if (j < c)
        for (int l = 0; l < c; l++) {
          t += (r[l] * m[w][l][j]) % 1000000007;
          t %= 1000000007;
        }
      r2[j] = t;
    }
    memcpy(r, r2, sizeof(r));
  }
  printf("%d\n", (int)r[0]);
  return 0;
}
