#include <bits/stdc++.h>   using namespace std;   using int64 = long long;   template <class T>   struct Matrix {     vector<vector<T> > A;     Matrix() {}     Matrix(size_t n, size_t m) : A(n, vector<T>(m, 0)) {}     Matrix(size_t n) : A(n, vector<T>(n, 0)){};     size_t height() const { return (A.size()); }     size_t width() const { return (A[0].size()); }     inline const vector<T> &operator[](int k) const { return (A.at(k)); }     inline vector<T> &operator[](int k) { return (A.at(k)); }     static Matrix I(size_t n) {       Matrix mat(n);       for (int i = 0; i < n; i++) mat[i][i] = 1;       return (mat);     }     Matrix &operator+=(const Matrix &B) {       size_t n = height(), m = width();       assert(n == B.height() && m == B.width());       for (int i = 0; i < n; i++)         for (int j = 0; j < m; j++) (*this)[i][j] += B[i][j];       return (*this);     }     Matrix &operator-=(const Matrix &B) {       size_t n = height(), m = width();       assert(n == B.height() && m == B.width());       for (int i = 0; i < n; i++)         for (int j = 0; j < m; j++) (*this)[i][j] -= B[i][j];       return (*this);     }     Matrix &operator*=(const Matrix &B) {       size_t n = height(), m = B.width(), p = width();       assert(p == B.height());       vector<vector<T> > C(n, vector<T>(m, 0));       for (int i = 0; i < n; i++)         for (int j = 0; j < m; j++)           for (int k = 0; k < p; k++)             C[i][j] = (C[i][j] + (*this)[i][k] * B[k][j]);       A.swap(C);       return (*this);     }     Matrix &operator^=(long long k) {       Matrix B = Matrix::I(height());       while (k > 0) {         if (k & 1) B *= *this;         *this *= *this;         k >>= 1LL;       }       A.swap(B.A);       return (*this);     }     Matrix operator+(const Matrix &B) const { return (Matrix(*this) += B); }     Matrix operator-(const Matrix &B) const { return (Matrix(*this) -= B); }     Matrix operator*(const Matrix &B) const { return (Matrix(*this) *= B); }     Matrix operator^(const long long k) const { return (Matrix(*this) ^= k); }     friend ostream &operator<<(ostream &os, Matrix &p) {       size_t n = p.height(), m = p.width();       for (int i = 0; i < n; i++) {         os <<  [ ;         for (int j = 0; j < m; j++) {           os << p[i][j] << (j + 1 == m ?  ] n  :  , );         }       }       return (os);     }     T determinant() {       Matrix B(*this);       assert(width() == height());       T ret = 1;       for (int i = 0; i < width(); i++) {         int idx = -1;         for (int j = i; j < width(); j++) {           if (B[j][i] != 0) idx = j;         }         if (idx == -1) return (0);         if (i != idx) {           ret *= -1;           swap(B[i], B[idx]);         }         ret *= B[i][i];         T vv = B[i][i];         for (int j = 0; j < width(); j++) {           B[i][j] /= vv;         }         for (int j = i + 1; j < width(); j++) {           T a = B[j][i];           for (int k = 0; k < width(); k++) {             B[j][k] -= B[i][k] * a;           }         }       }       return (ret);     }   };   template <int mod>   struct ModInt {     int x;     ModInt() : x(0) {}     ModInt(long long y) : x(y >= 0 ? y % mod : (mod - (-y) % mod) % mod) {}     ModInt &operator+=(const ModInt &p) {       if ((x += p.x) >= mod) x -= mod;       return *this;     }     ModInt &operator-=(const ModInt &p) {       if ((x += mod - p.x) >= mod) x -= mod;       return *this;     }     ModInt &operator*=(const ModInt &p) {       x = (int)(1LL * x * p.x % mod);       return *this;     }     ModInt &operator/=(const ModInt &p) {       *this *= p.inverse();       return *this;     }     ModInt operator-() const { return ModInt(-x); }     ModInt operator+(const ModInt &p) const { return ModInt(*this) += p; }     ModInt operator-(const ModInt &p) const { return ModInt(*this) -= p; }     ModInt operator*(const ModInt &p) const { return ModInt(*this) *= p; }     ModInt operator/(const ModInt &p) const { return ModInt(*this) /= p; }     bool operator==(const ModInt &p) const { return x == p.x; }     bool operator!=(const ModInt &p) const { return x != p.x; }     ModInt inverse() const {       int a = x, b = mod, u = 1, v = 0, t;       while (b > 0) {         t = a / b;         a -= t * b;         swap(a, b);         u -= t * v;         swap(u, v);       }       return ModInt(u);     }     friend ostream &operator<<(ostream &os, const ModInt<mod> &p) {       return os << p.x;     }     friend istream &operator>>(istream &is, ModInt<mod> &a) {       long long x;       is >> x;       a = ModInt<mod>(x);       return (is);     }   };   const int mod = 1e9 + 7;   using modint = ModInt<mod>;   int main() {     int64 N, M;     cin >> N >> M;     map<int64, vector<pair<int, int> > > add;     for (int i = 0; i < N; i++) {       int64 A, L, R;       cin >> A >> L >> R;       --A;       add[L - 1].emplace_back(A, 1);       add[R].emplace_back(A, -1);     }     add[1].emplace_back(-1, -1);     add[M].emplace_back(-1, -1);     vector<modint> sum(3, 0);     Matrix<modint> mat(3, 3);     vector<int> inc(3, 0);     int64 pv = -1;     for (auto &p : add) {       for (auto &v : p.second) {         if (~v.first) inc[v.first] += v.second;       }       Matrix<modint> mat2(3, 3);       for (int i = 0; i < 3; i++) {         for (int j = -1; j <= 1; j++) {           int k = i + j;           if (k < 0 || k >= 3) continue;           if (inc[k] == 0) mat2[i][k] = 1;         }       }       if (~pv) {         mat ^= p.first - pv;         vector<modint> sum2(3);         for (int i = 0; i < 3; i++) {           for (int j = 0; j < 3; j++) {             sum2[j] += sum[i] * mat[i][j];           }         }         sum.swap(sum2);       } else {         sum[1] = 1;       }       mat = mat2;       pv = p.first;     }     cout << sum[1] << endl;   }