#include <bits/stdc++.h>
using namespace std;
const int MAXN=2010;
#define ll long long
#define int ll
const int mo=1e9+7;
struct po
{
	int x,y,l;
}a[MAXN];
bool cmp(po a,po b){return a.l<b.l;}
int n,m,tmp,x;
int f[MAXN];
int find(int x) {return x==f[x]?x:f[x]=find(f[x]);}
int kruskal(int now)
{
	int res=0;
	for(int i=1;i<=n;i++) f[i]=i;
	if(now) {res+=a[now].l;f[a[now].x]=a[now].y;}
	for(int i=1;i<=m;i++){
		int r1=find(a[i].x),r2=find(a[i].y);
		if(r1==r2) continue;
		res+=a[i].l;
		f[r1]=r2;
	}
	return res;
}
inline int power(int x,int k)
{
	int cnt=1;
	while(k){
		if(k&1) cnt=cnt*x%mo;
		k>>=1;
		x=x*x%mo;
	}
	return cnt;
}
int val,cnt1,cnt2;
int ans;
main()
{
	cin>>n>>m>>x;
	for(int i=1;i<=m;i++) cin>>a[i].x>>a[i].y>>a[i].l;
	sort(a+1,a+m+1,cmp);
	tmp=kruskal(0);
	if(tmp>x){
		cout<<0;
		return 0;
	}
	if(tmp==x){
		for(int i=1;i<=m;i++){
			val=kruskal(i);
			if(val==x) cnt1++;
			else cnt2++;
		}
		ans=((power(2,cnt1)-2)*power(2,cnt2)%mo+mo)%mo;
	} else {
		for(int i=1;i<=m;i++){
			val=kruskal(i);
			if(val==x) cnt1++;
			else if(val>x) cnt2++;
		}
		ans=(2*(power(2,cnt1)-1)%mo*power(2,cnt2)%mo+mo)%mo;
	}
	cout<<ans;
}