#include using namespace std; using LL = long long; using ULL = unsigned long long; #define rep(i,n) for(int i=0; i<(n); i++) template struct modint { ULL x; modint(ULL val = 0) : x(val) {} modint& operator+=(modint r) { x += r.x; if (x >= M) x -= M; return *this; } modint operator+(modint r) const { modint res = x; return res += r; } modint& operator-=(modint r) { x += M - r.x; if (x >= M) x -= M; return *this; } modint operator-(modint r) const { modint res = x; return res -= r; } modint& operator*=(modint r) { x = x * r.x % M; return *this; } modint operator*(modint r) const { return modint(x * r.x % M); } modint operator^(ULL r) const { if (r == 0) return modint(1); modint res = (*this * *this) ^ (r / 2); if (r % 2) res *= *this; return res; } modint& operator^=(ULL r) { return *this = *this ^ r; } modint& operator/=(modint r) { *this *= r ^ (M - 1); return *this; } modint operator/(modint r) const { return *this * (r ^ (M - 2)); } ULL& operator*() { return x; } const ULL& operator*() const { return x; } bool operator==(ULL r) const { return x == r; } bool operator!=(ULL r) const { return x != r; } }; template struct Matrix { Elem X[matrix_sz][matrix_sz] = {}; static Matrix id() { Matrix res; rep(i, matrix_sz) res[i][i] = 1; return res; } Elem* operator[](int x) { return X[x]; } const Elem* operator[](int x) const { return X[x]; } Matrix operator*(Matrix r) const { Matrix res; rep(i, matrix_sz) rep(j, matrix_sz) rep(k, matrix_sz) res[i][j] += (*this)[i][k] * r[k][j]; return res; } Matrix pow(ULL N) const { if (N == 0) return id(); Matrix res = pow(N / 2); res = res * res; if (N % 2 == 1) res = res * *this; return res; } }; const ULL M = 1000000007; const int matrix_sz = 36; using MLL = modint; using xMat = Matrix; int main() { ULL K, J, N; cin >> K >> J >> N; xMat G; rep(j, J) { int u, v, w; cin >> u >> v >> w; u--; v--; w--; G[u * K + v][v * K + w] = 1; } G = G.pow(N - 2); MLL ans = 0; rep(i, K) rep(j, K) ans += G[i][j * K]; cout << *ans << endl; return 0; }