#include<bits/stdc++.h>
const int N=2003,M=1000000007,inf=2e9;
using namespace std;
map<long long,int>mp;
int n,m,to[N],hd[N],lk[N],ln[N],cnt,
u,v,w,bin[N];
inline void add(int u,int v){
	to[++cnt]=v,hd[cnt]=lk[u],lk[u]=cnt,ln[cnt]=w;
}
void dfs(int x,int y,int d){
	if(x==v){w=d;return;}
	for(int i=lk[x];i;i=hd[i])
	if(to[i]^y)dfs(to[i],x,max(d,ln[i]));
}
long long lim;
struct ed{int u,v,w;}a[N];
int main(){
	scanf("%d%d%lld",&n,&m,&lim),bin[0]=1;
	for(int i=0;i<m;i++)bin[i+1]=bin[i]*2%M,
	scanf("%d%d%d",&u,&v,&w),a[i]={u,v,w};
	sort(a,a+m,[](ed x,ed y){return x.w<y.w;});
	for(int i=0;i<m;i++){
		u=a[i].u,v=a[i].v,w=inf;
		dfs(u,0,0);
		if(w<inf)mp[a[i].w-w]++;
		else mp[0]++,w=a[i].w,lim-=w,add(u,v),add(v,u);
	}
	u=mp[lim],v=0;
	for(auto i:mp)if(i.first>lim)v+=i.second;
	printf("%d",lim?(bin[u]-1ll)*bin[v+1]%M:(bin[u]-2ll)*bin[v]%M);
}