#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
inline long long read() {
  char c = getchar();
  long long x = 0;
  bool f = 0;
  for (; !isdigit(c); c = getchar()) f ^= !(c ^ 45);
  for (; isdigit(c); c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
  if (f) x = -x;
  return x;
}
long long res, n, m, k;
vector<pair<long long, long long> > e[200005];
vector<long long> v[13];
const long long b1 = 19491001;
unsigned long long pw[200005], sumn, sum[13][13], qwq;
void dfs(long long u) {
  if (u == k + 1) {
    res += (qwq == sumn);
    return;
  }
  for (register long long i = (0); i <= (u - 1); ++i) {
    qwq += sum[u][i];
    dfs(u + 1);
    qwq -= sum[u][i];
  }
}
signed main() {
  n = read(), m = read(), k = read();
  pw[0] = 1;
  for (register long long i = (1); i <= (n); ++i)
    pw[i] = pw[i - 1] * b1, sumn += pw[i];
  for (register long long i = (1); i <= (m); ++i) {
    long long u = read(), v = read(), w = read();
    e[u].push_back(make_pair(w, v));
  }
  for (register long long i = (1); i <= (n); ++i)
    sort(e[i].begin(), e[i].end()), v[e[i].size()].push_back(i);
  for (register long long i = (1); i <= (k); ++i)
    for (register long long j = (0); j <= (i - 1); ++j) {
      unsigned long long now = 0;
      for (long long p = 0; p < v[i].size(); ++p)
        now += pw[e[v[i][p]][j].second];
      sum[i][j] = now;
    }
  dfs(1);
  cout << res;
  return 0;
}
