#include <bits/stdc++.h>
using namespace std;
int x[2000], y[2000], c[2000];
vector<int> poss;
multiset<int> xx[2000];
vector<pair<int, int> > events;
map<pair<int, int>, int> M;
long long int sum = 0, ans = 0;
int update(int e, int m) {
  if (e < 0) return 0;
  auto it = M.upper_bound(make_pair(e, 2e9));
  it--;
  if (it->first.second != e) {
    pair<int, int> p = it->first;
    int v = it->second;
    M.erase(it);
    M[make_pair(p.first, e)] = v;
    M[make_pair(e + 1, p.second)] = v;
  }
  it = M.upper_bound(make_pair(e, 2e9));
  it--;
  if (it->second < m) return 0;
  pair<int, int> p = make_pair(e, e);
  while (it->second >= m) {
    p.first = it->first.first;
    sum -= (long long int)(it->first.second - it->first.first + 1) * it->second;
    it = M.erase(it);
    if (it == M.begin())
      break;
    else
      it--;
  }
  M[p] = m;
  sum += (long long int)(p.second - p.first + 1) * m;
  return 0;
}
int main() {
  int i;
  int n, k, L;
  scanf("%d %d %d", &n, &k, &L);
  poss.push_back(-1), poss.push_back(L);
  for (i = 0; i < n; i++) {
    scanf("%d %d %d", &x[i], &y[i], &c[i]), c[i]--;
    poss.push_back(y[i]);
  }
  sort(poss.begin(), poss.end());
  poss.resize(unique(poss.begin(), poss.end()) - poss.begin());
  int j;
  for (i = 1; i < poss.size(); i++) {
    int yy = poss[i] - poss[i - 1];
    for (j = 0; j < n; j++) {
      if (y[j] > poss[i - 1]) {
        events.push_back(make_pair(y[j], j));
        xx[c[j]].insert(x[j]);
      }
    }
    M.clear();
    M[make_pair(0, L - 1)] = L, sum = (long long int)L * L;
    for (j = 0; j < k; j++) {
      if (xx[j].empty()) break;
      int p = -1;
      for (auto it = xx[j].begin(); it != xx[j].end(); it++)
        update(*it - 1, p + 1), p = *it;
      update(L - 1, p + 1);
    }
    if (j < k) break;
    sort(events.begin(), events.end(), greater<pair<int, int> >());
    int l = L;
    for (j = 0; j < events.size(); j++) {
      int u = events[j].second;
      long long int nn = (long long int)yy * (l - events[j].first);
      nn %= 1000000007;
      ans += nn * (sum % 1000000007), ans %= 1000000007;
      auto it = xx[c[u]].lower_bound(x[u]);
      it = xx[c[u]].erase(it);
      int a = (it == xx[c[u]].end()) ? L - 1 : *it - 1;
      int b = (it == xx[c[u]].begin()) ? 0 : *(--it) + 1;
      update(a, b);
      if (xx[c[u]].empty()) break;
      l = events[j].first;
    }
    for (j = 0; j < k; j++) xx[j].clear();
    events.clear();
  }
  printf("%I64d\n", ans);
  return 0;
}
