#include <bits/stdc++.h>
using namespace std;
long long n, k;
const long long mod = 1000000007;
struct li {
  long long fr, to;
  int hei;
} s[105];
struct mat {
  int l, h;
  long long s[20][20];
  mat() { memset(s, 0, sizeof(s)); }
};
void out(mat x) {
  cout << endl << endl;
  ;
  for (int i = 0; i < x.h; i++) {
    for (int j = 0; j < x.l; j++) cout << x.s[i][j] << ' ';
    cout << endl;
  }
  cout << endl << endl;
}
inline mat dw(int siz) {
  mat ans;
  ans.h = ans.l = siz;
  for (int i = 0; i < siz; i++) ans.s[i][i] = 1;
  return ans;
}
mat operator*(mat a, mat b) {
  mat ans;
  ans.h = a.h;
  ans.l = b.l;
  for (int i = 0; i < ans.h; i++)
    for (int j = 0; j < ans.l; j++)
      for (int k = 0; k < a.l; k++)
        ans.s[i][j] = ((ans.s[i][j] + a.s[i][k] * b.s[k][j])) % mod;
  return ans;
}
mat qpow(mat a, long long b) {
  mat ans = dw(a.l);
  for (int i = 63; i >= 0; i--) {
    ans = ans * ans;
    if ((b >> i) & 1) ans = ans * a;
  }
  return ans;
}
int main() {
  ios::sync_with_stdio(false);
  cin >> n >> k;
  for (int i = 0; i < n; i++) cin >> s[i].fr >> s[i].to >> s[i].hei;
  mat ans;
  ans.h = 1;
  ans.l = 16;
  ans.s[0][0] = 1;
  for (int i = 0; i < n; i++) {
    if (s[i].fr >= k) break;
    mat nowans = ans;
    nowans.l = s[i].hei + 1;
    for (int j = nowans.l; j <= 15; j++) nowans.s[0][j] = 0;
    mat tt;
    tt.h = tt.l = s[i].hei + 1;
    for (int j = 0; j < tt.h; j++)
      for (int ne = j - 1; ne <= j + 1; ne++) {
        if (ne < 0 || ne >= tt.h) continue;
        tt.s[ne][j] = 1;
      }
    nowans = nowans * qpow(tt, min(k, s[i].to) - s[i].fr);
    ans = nowans;
  }
  cout << ans.s[0][0] << endl;
  return 0;
}
