#include using namespace std; using ll = long long; using ld = long double; using vl = vector; template using vc = vector; template using vvc = vector>; #define eb emplace_back #define all(x) (x).begin(), (x).end() #define rep(i, n) for (ll i = 0; i < (n); i++) #define repr(i, n) for (ll i = (n)-1; i >= 0; i--) #define repe(i, l, r) for (ll i = (l); i < (r); i++) #define reper(i, l, r) for (ll i = (r)-1; i >= (l); i--) #define repa(i,n) for (auto& i: n) template inline bool chmax(T &a, const T &b) { if (a inline bool chmin(T &a, const T &b) { if (b void verr(const T& a, const N& n) { rep(i, n) cerr << a[i] << " "; cerr << "\n" << flush; } ll dbgt = 1; void err() { cerr << "passed " << dbgt++ << "\n" << flush; } template void err(H&& h,T&&... t){ cerr<< h << (sizeof...(t)?" ":"\n") << flush; if(sizeof...(t)>0) err(forward(t)...); } #endif const ll INF = 4e18; const ld EPS = 1e-11; const ld PI = acos(-1.0L); const ll MOD = 1e9 + 7; // const ll MOD = 998244353; //--------------------------------------------------------------------------------// // modint template struct Fp { long long val; constexpr Fp(long long v = 0) noexcept : val(v % MOD) { if (val < 0) val += MOD; } constexpr int getmod() { return MOD; } constexpr Fp operator - () const noexcept { return val ? MOD - val : 0; } constexpr Fp operator + (const Fp& r) const noexcept { return Fp(*this) += r; } constexpr Fp operator - (const Fp& r) const noexcept { return Fp(*this) -= r; } constexpr Fp operator * (const Fp& r) const noexcept { return Fp(*this) *= r; } constexpr Fp operator / (const Fp& r) const noexcept { return Fp(*this) /= r; } constexpr Fp& operator += (const Fp& r) noexcept { val += r.val; if (val >= MOD) val -= MOD; return *this; } constexpr Fp& operator -= (const Fp& r) noexcept { val -= r.val; if (val < 0) val += MOD; return *this; } constexpr Fp& operator *= (const Fp& r) noexcept { val = val * r.val % MOD; return *this; } constexpr Fp& operator /= (const Fp& r) noexcept { long long a = r.val, b = MOD, u = 1, v = 0; while (b) { long long t = a / b; a -= t * b; swap(a, b); u -= t * v; swap(u, v); } val = val * u % MOD; if (val < 0) val += MOD; return *this; } constexpr bool operator == (const Fp& r) const noexcept { return this->val == r.val; } constexpr bool operator != (const Fp& r) const noexcept { return this->val != r.val; } friend constexpr ostream& operator << (ostream &os, const Fp& x) noexcept { return os << x.val; } friend constexpr Fp modpow(const Fp &a, long long n) noexcept { if (n == 0) return 1; auto t = modpow(a, n / 2, MOD); t = t * t; if (n & 1) t = t * a; return t; } }; using mint = Fp; template struct Matrix { vector> mat; int row, col; Matrix(int r, int c, T v = 0) : mat(r, vector(c, v)), row(r), col(c){}; inline const vector &operator[](int k) const { return mat[k]; } inline vector &operator[](int k) { return mat[k]; } Matrix &operator+=(const Matrix &A) { for (int i = 0; i < row; i++) for (int j = 0; j < col; j++) (*this)[i][j] += A[i][j]; return (*this); } Matrix &operator-=(const Matrix &A) { for (int i = 0; i < row; i++) for (int j = 0; j < col; j++) (*this)[i][j] -= A[i][j]; return (*this); } Matrix &operator*=(const Matrix &A) { vector> res(row, vector(A.col, 0)); for (int i = 0; i < row; i++) for (int j = 0; j < A.col; j++) for (int k = 0; k < col; k++) res[i][j] += mat[i][k] * A[k][j]; mat.swap(res); (*this).col = A.col; return (*this); } Matrix &operator^=(long long p) { Matrix res = Matrix(row, col); for (int i = 0; i < row; i++) res[i][i] = 1; while(p > 0){ if (p & 1) res *= *this; *this *= *this; p >>= 1; } mat.swap(res.mat); 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) { for (int i = 0; i < p.row; i++) { os << "["; for (int j = 0; j < p.col; j++) { os << p[i][j] << (j + 1 == p.col ? "]\n" : ","); } } return (os); } }; int main() { init(); ll K, M, N; cin >> K >> M >> N; vc> A(M); rep(i, M) cin >> A[i][0] >> A[i][1] >> A[i][2], A[i][0]--, A[i][1]--, A[i][2]--; ll K3 = K * K * K, K2 = K * K; Matrix P(K3, K3), C(K3, 1); rep(i, M) if(A[i][0]==0) C[A[i][0] * K2 + A[i][1] * K + A[i][2]][0] += 1; rep(i, M) { rep(j, K){ // err(A[i][1] * K + A[i][2] + j, A[i][0] * K2 + A[i][1] * K + A[i][2]); // P[A[i][0] * K2 + A[i][1] * K + A[i][0]][j * K2 + A[i][0] * K + A[i][1]] += 1; P[A[i][1] * K2 + A[i][2] * K + j][A[i][0] * K2 + A[i][1] *K + A[i][2]] += 1; } } // err(P); P ^= N - 2; // err(P); C = P * C; mint ans = 0; rep(i, K3) if (i % K2 == 0) ans += C[i][0]; cout << ans << endl; }