#include #define For(i,x,y) for (register int i=(x);i<=(y);i++) #define FOR(i,x,y) for (register int i=(x);i<(y);i++) #define Dow(i,x,y) for (register int i=(x);i>=(y);i--) #define Debug(v) for (auto i:v) cout< pa; typedef pair PA; typedef vector poly; inline ll read(){ ll x=0,f=1;char c=getchar(); while ((c<'0'||c>'9')&&(c!='-')) c=getchar(); if (c=='-') f=-1,c=getchar(); while (c>='0'&&c<='9') x=x*10+c-'0',c=getchar(); return x*f; } const int N = 210, mod = 998244353; const ll mod2 = 8ll*mod*mod; int n,m,k,cnt,id[N][2],inv[N*N],d[N]; vectore[N]; inline int Mod(int x){ return x>=mod?x-mod:x; } struct mat{ int a[N][N]; inline mat operator * (const mat &o)const{ mat ret; For(i,1,cnt) For(j,1,cnt){ ll tmp=0; For(k,1,cnt){ tmp=tmp+1ll*a[i][k]*o.a[k][j]; if (tmp>=mod2) tmp-=mod2; } ret.a[i][j]=tmp%mod; } return ret; } }t; inline mat power(mat a,int b){ mat ret=a; for (--b;b;b>>=1,a=a*a) if (b&1) ret=ret*a; return ret; } inline void solve(){ n=read(),m=read(),k=read(); For(i,1,n) d[i]=0,e[i].clear(); For(i,1,m){ int x=read(),y=read(),z=read(); d[x]++,d[y]++; e[x].ep(y,z),e[y].ep(x,z); } inv[0]=inv[1]=1; For(i,2,m) inv[i]=1ll*inv[mod%i]*(mod-mod/i)%mod; cnt=0; For(i,1,n) For(j,0,1) id[i][j]=++cnt; fil(t.a,0); For(i,1,n) For(j,0,1) for (auto E:e[i]){ int v=E.fi,w=E.se; t.a[id[i][j]][id[v][j^w]]=Mod(t.a[id[i][j]][id[v][j^w]]+inv[d[i]]); } mat ans; fil(ans.a,0); ans.a[1][id[1][0]]=1; ans=ans*power(t,k); printf("%d\n",ans.a[1][id[n][1]]); } int main(){ int T=read(); while (T--) solve(); }