#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef vector vl; typedef vector vvl; typedef vector vc; typedef vector vs; typedef vector vb; typedef vector vd; typedef pair P; typedef pair pii; typedef vector

vpl; typedef tuple tapu; #define rep(i,n) for(int i=0; i<(n); i++) #define REP(i,a,b) for(int i=(a); i<(b); i++) #define all(x) (x).begin(), (x).end() #define rall(x) (x).rbegin(), (x).rend() const int inf = 1<<30; const ll linf = 1LL<<62; const int MAX = 510000; ll dy[8] = {0,-1,0,1,1,-1,1,-1}; ll dx[8] = {1,0,-1,0,1,-1,-1,1}; const double pi = acos(-1); const double eps = 1e-7; template inline bool chmin(T1 &a,T2 b){ if(a>b){ a = b; return true; } else return false; } template inline bool chmax(T1 &a,T2 b){ if(a inline void print(T &a){ rep(i,a.size()) cout << a[i] << " "; cout << "\n"; } template inline void print2(T1 a, T2 b){cout << a << " " << b << "\n";} template inline void print3(T1 a, T2 b, T3 c){ cout << a << " " << b << " " << c << "\n"; } const ll mod = 1e9 + 7; //const int mod = 998244353; template class modint { using u64 = std::uint_fast64_t; public: u64 a; constexpr modint(const u64 x = 0) noexcept : a(x % Modulus) {} constexpr u64 &value() noexcept { return a; } constexpr const u64 &value() const noexcept { return a; } constexpr modint operator+(const modint rhs) const noexcept { return modint(*this) += rhs; } constexpr modint operator-(const modint rhs) const noexcept { return modint(*this) -= rhs; } constexpr modint operator*(const modint rhs) const noexcept { return modint(*this) *= rhs; } constexpr modint operator/(const modint rhs) const noexcept { return modint(*this) /= rhs; } constexpr modint &operator+=(const modint rhs) noexcept { a += rhs.a; if (a >= Modulus) { a -= Modulus; } return *this; } constexpr modint &operator-=(const modint rhs) noexcept { if (a < rhs.a) { a += Modulus; } a -= rhs.a; return *this; } constexpr modint &operator*=(const modint rhs) noexcept { a = a * rhs.a % Modulus; return *this; } constexpr modint &operator/=(modint rhs) noexcept { u64 exp = Modulus - 2; while (exp) { if (exp % 2) { *this *= rhs; } rhs *= rhs; exp /= 2; } return *this; } }; using mint = modint; vvl matmul(vvl &a, vvl &b){ vvl c(a.size(), vl(b[0].size())); for(int i=0; i 0){ if(n & 1) b = matmul(b,a); a = matmul(a,a); n >>= 1; } return b; } ll modpow(ll x, ll n, ll mod){ ll res = 1; while(n > 0){ if(n & 1) res = res * x % mod; x = x * x % mod; n >>= 1; } return res; } ll a[6][6][6]; int main(){ ll K,m,n; cin >> K >> m >> n; rep(i,m){ ll p,q,r; cin >> p >> q >> r; p--; q--; r--; a[p][q][r] = 1; } ll ans = 0; if(n == 3){ rep(j,K) ans += a[0][j][0]; cout << ans << "\n"; return 0; } ll L = K*K; vvl b(L,vl(L,0)); vl c(L,0); rep(j,K){ rep(k,K){ c[j*K + k] += a[0][j][k]; } } rep(i,K){ rep(j,K){ rep(k,K){ b[j*K+k][i*K+j] += a[i][j][k]; } } } b = matpow(b,n-4); rep(i,L){ if(!a[i/K][i%K][0]) continue; ll sum = 0; rep(j,L){ sum += b[i][j] * c[j] % mod; sum %= mod; } ans += sum; ans %= mod; } cout << ans << "\n"; }