#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
struct edge{
	int u,v,w;
	bool operator <(const edge b)const{
		return w<b.w;
	}
}e[2005];
int fa[1005];
int d[1005][1005];
vector<pair<int,int> >E[1005];
void dfs(int x,int fa,int r){
	for(int i=0;i<E[x].size();i++)if(E[x][i].first!=fa){
		d[r][E[x][i].first]=max(d[r][x],E[x][i].second);
		dfs(E[x][i].first,x,r);
	}
}
map<long long,int> f;
inline int getfa(int x){return (fa[x]==x?x:fa[x]=getfa(fa[x]));}
const int mod=1e9+7;
inline int power(int x,int y){
	int z=1;
	while(y){
		if(y&1)z=1ll*z*x%mod;
		x=1ll*x*x%mod;
		y>>=1;
	}
	return z;
}
int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	long long X;
	scanf("%lld",&X);
	for(int i=1;i<=m;i++)scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
	sort(e+1,e+m+1);
	for(int i=1;i<=n;i++)fa[i]=i;
	long long res=0;
	for(int i=1;i<=m;i++){
		int u=getfa(e[i].u),v=getfa(e[i].v);
		if(u!=v){
			res+=e[i].w;
			fa[u]=v;
			E[e[i].u].push_back(make_pair(e[i].v,e[i].w));
			E[e[i].v].push_back(make_pair(e[i].u,e[i].w));
		}
	}
	for(int i=1;i<=n;i++)dfs(i,0,i);
	for(int i=1;i<=m;i++)f[e[i].w-d[e[i].u][e[i].v]]++;
	if(X==res){
		printf("%d\n",1ll*(power(2,f[0])-2)*power(2,m-f[0])%mod);
		return 0;
	}else{
		int sum=0;
		for(map<long long,int>::iterator it=f.begin();it!=f.end();it++){
			if(it->first==X-res){
				sum+=it->second;
				// printf("%d %d\n",it->second,sum);
				printf("%d\n",2ll*(power(2,it->second)-1)*power(2,m-sum)%mod);
				return 0;
			}else sum+=it->second;
		}
	}
	puts("0");
	return 0;
}