#include using namespace std; const int mod = 998244353; const int N = 205; int n, m, k; vector > G[N]; struct Mat { int mat[N][N]; inline Mat(int x = 0) { memset(mat, 0, sizeof(mat)); if (x) for (int i = 1; i <= 2 * n; i++) mat[i][i] = x; } inline Mat operator * (const Mat &oth) const { Mat res; for (int i = 1; i <= 2 * n; i++) for (int k = 1; k <= 2 * n; k++) for (int j = 1; j <= 2 * n; j++) { res.mat[i][j] = (res.mat[i][j] + 1ll * mat[i][k] * oth.mat[k][j]) % mod; } return res; } }; inline Mat matpow(Mat a, int b) { Mat res(1); while (b) { if (b & 1) res = res * a; a = a * a; b >>= 1; } return res; } int inv[N]; int main() { inv[1] = 1; for (int i = 2; i < N; i++) inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod; int T; scanf("%d", &T); while (T--) { scanf("%d%d%d", &n, &m, &k); for (int i = 1; i <= n; i++) { G[i].clear(); } for (int i = 1; i <= m; i++) { int u, v, w; scanf("%d%d%d", &u, &v, &w); G[u].emplace_back(v, w); G[v].emplace_back(u, w); } Mat a; for (int i = 1; i <= n; i++) { for (auto &e : G[i]) { int j = e.first; if (!e.second) { a.mat[j][i] = a.mat[j + n][i + n] = inv[G[i].size()]; } else { a.mat[j + n][i] = a.mat[j][i + n] = inv[G[i].size()]; } } } a = matpow(a, k); printf("%d\n", a.mat[n * 2][1]); } return 0; }