#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){
f=ch=='-'?-f:f;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<3)+(x<<1)+(ch^48);
ch=getchar();
}
return f*x;
}
const int p=1e9+7,N=2505;
int Q,m,X,Y,n;
int f[N][N];
int h[N],ne[N<<1],t[N<<1],w[N<<1],cnt;
void add(int x,int y,int z){
t[++cnt]=y;
w[cnt]=z;
ne[cnt]=h[x];
h[x]=cnt;
}
int v[N];
int a[N];
vector<int>g[N],sum[N],tre[N];
int tre_sum;
void dfs(int start,int u,int fa,int step){
if(v[u]==0)tre[tre_sum].push_back(u),v[u]=tre_sum;
f[start][u]=step;
for(int e=h[u];e;e=ne[e]){
if(t[e]==fa)continue;
dfs(start,t[e],u,step+w[e]);
}
}
void q(int x){
memset(a,0,sizeof a);
int l=tre[x].size();
for(int i=0;i<l;++i){
for(int j=0;j<l;++j){
if(i!=j)++a[min(f[tre[x][i]][tre[x][j]],Y)];
}
}
for(int i=0;i<=Y;++i){
if(a[i]){
g[x].push_back(i);
sum[x].push_back(a[i]);
}
}
}
int F[N][N],G[N][N];
signed main(){
freopen("P5243_4.in","r",stdin);
Q=read();m=read();X=read();Y=read();
n=Q-m;
int st=min(n*X,Y);
int x,y,z;
while(m--){
x=read();y=read();z=read();
add(x,y,z);add(y,x,z);
}
for(int i=1;i<=Q;++i){
if(!v[i])++tre_sum;
dfs(i,i,0,0);
}
memset(v,0,sizeof v);
for(int i=1;i<=n;++i)q(i);
memset(G,-1,sizeof G);
F[0][st]=X*n;G[0][st]=1;
for(int i=1;i<=n;++i){
int l=g[i].size();
for(int j=0;j<l;++j){
for(int k=Y;k>=st;--k){
if(G[i-1][k]!=-1){
int K=min(k+g[i][j],Y);
if(G[i][K]==-1)G[i][K]=0;
G[i][K]+=sum[i][j]*G[i-1][k]%p;
G[i][K]%=p;
F[i][K]+=(F[i-1][k]*sum[i][j]%p+g[i][j]*G[i-1][k]%p*sum[i][j]%p)%p;
F[i][K]%=p;
}
}
}
}
int op=1;
for(int i=2;i<n;++i)op=i*op%p;
cout<<F[n][Y]%p*op%p*(p+1)/2%p;
}