#include #define pb push_back #define mp make_pair #define fi first #define se second using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair pii; typedef pair pll; template bool chkmax(T &x,T y){return x bool chkmin(T &x,T y){return x>y?x=y,true:false;} int readint(){ int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } const int cys=998244353; int n,m,k; int c[205][205],f[205][205],tmp[205],du[205],ans[205],x[10005],y[10005],z[10005]; ll qpow(ll x,ll p){ ll ret=1; for(;p;p>>=1,x=x*x%cys) if(p&1) ret=ret*x%cys; return ret; } int main(){ int T=readint(); while(T--){ n=readint(); m=readint(); k=readint(); memset(c,0,sizeof(c)); memset(du,0,sizeof(du)); memset(ans,0,sizeof(ans)); for(int i=1;i<=m;i++){ x[i]=readint(); y[i]=readint(); z[i]=readint(); du[x[i]]++,du[y[i]]++; } for(int i=1;i<=m;i++){ if(z[i]) c[y[i]+n][x[i]]=c[y[i]][x[i]+n]=qpow(du[x[i]],cys-2); else c[y[i]][x[i]]=c[y[i]+n][x[i]+n]=qpow(du[x[i]],cys-2); if(z[i]) c[x[i]+n][y[i]]=c[x[i]][y[i]+n]=qpow(du[y[i]],cys-2); else c[x[i]][y[i]]=c[x[i]+n][y[i]+n]=qpow(du[y[i]],cys-2); } ans[1]=1; for(;k;k>>=1){ if(k&1){ for(int i=1;i<=n+n;i++) tmp[i]=0; for(int i=1;i<=n+n;i++) for(int j=1;j<=n+n;j++) tmp[i]=(tmp[i]+1ll*c[i][j]*ans[j])%cys; for(int i=1;i<=n+n;i++) ans[i]=tmp[i]; } for(int i=1;i<=n+n;i++){ for(int j=1;j<=n+n;j++){ f[i][j]=0; ull res=0; for(int k=1;k<=n+n;k++){ res+=(ull)c[i][k]*c[k][j]; if(res>9e18) res%=cys; } f[i][j]=res%cys; } } for(int i=1;i<=n+n;i++) for(int j=1;j<=n+n;j++) c[i][j]=f[i][j]; } printf("%d\n",ans[n+n]); } return 0; }