传送门:CF-821E
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef long long LL;
const LL mod = 1e9 + 7;
int sz;
struct Mat {
LL x[16][16];
Mat() {
memset(x, 0, sizeof(x));
}
void init() {
for (int i = 0; i < sz; i++) x[i][i] = 1;
}
Mat operator*(const Mat& m)const {
Mat ret;
for (int i = 0; i < sz; i++)
for (int j = 0; j < sz; j++)
for (int k = 0; k < sz; k++)
(ret.x[i][j] += x[i][k] * m.x[k][j] % mod) %= mod;
return ret;
}
void print() {
for (int i = 0; i < sz; i++) for (int j = 0; j < sz; j++) printf("[%I64d]%c", x[i][j], j == sz - 1 ? '\n' : ' ');
}
};
Mat pow(Mat A, LL b) {
Mat ret; ret.init();
while (b) {
if (b & 1) ret = ret * A;
A = A * A;
b >>= 1;
}
return ret;
}
int main(void) {
//freopen("in.txt", "r", stdin);
int n;
LL k, l, r;
scanf("%d%I64d", &n, &k);
Mat B; B.x[0][0] = 1;
for (int ii = 1; ii <= n; ii++) {
scanf("%I64d%I64d%d", &l, &r, &sz); sz++;
Mat A;
for (int i = 0; i < sz; i++) for (int j = 0; j < sz; j++) if (abs(i - j) <= 1) A.x[i][j] = 1;
A = pow(A, ii == n ? k - l : r - l);
B = A * B;
//B.print();
}
printf("%I64d\n", B.x[0][0]);
return 0;
}