#include<bits/stdc++.h>
#define rep(i,x,y) for (int i=(x); i<=(y); i++)
#define per(i,x,y) for (int i=(x); i>=(y); i--)
#define ll long long
#define ld long double
#define inf 1000000000
#define INF 1000000000000000000ll
#define pii pair<int,int>
#define F first
#define S second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define sqr(x) ((x)*(x))
#define cmin(x,y) (x)=(((y)<(x))?(y):(x))
#define cmax(x,y) (x)=(((y)>(x))?(y):(x))
using namespace std;
const ld pi=acos(-1);
const ld eps=1e-8;
//////////////////////// header files ////////////////////////
ll read(){
	char ch=getchar(); ll x=0; int op=1;
	for (; !isdigit(ch); ch=getchar()) if (ch=='-') op=-1;
	for (; isdigit(ch); ch=getchar()) x=(x<<1)+(x<<3)+ch-'0';
	return x*op;
}
void write(ll a){
	if (a<0) putchar('-'),a=-a;
	if (a>=10) write(a/10); putchar(a%10+'0');
}
////////////////////////// fast i/o //////////////////////////
#define mod 1000000007
#ifdef mod
ll ksm(ll x,ll p){
	ll ret=1;
	for (; p; p>>=1,x=x*x%mod) if (p&1) ret=ret*x%mod;
	return ret;
}
ll get_inv(ll x){
	return ksm(x,mod-2);
}
#else
ll ksm(ll x,ll p){
	ll ret=1;
	for (; p; p>>=1,x=x*x) if (p&1) ret=ret*x;
	return ret;
}
#endif
//////////////////////////// qpow ////////////////////////////
#define N 5005
int n,m,fa[N],equ,upp,cur,ans; ll X,sum,D;
struct data{ int x,y,z; bool cho; }a[N];
const bool cmp(const data &x,const data &y){ return x.z<y.z; }
int getfa(int x){
	return x==fa[x]?x:fa[x]=getfa(fa[x]);
}
struct edge{ int to,nxt,v; }e[N];
int cnt,head[N],f[N][20],mx[N][20],dep[N];
void adde(int x,int y,int z){
	e[++cnt].to=y; e[cnt].nxt=head[x]; e[cnt].v=z;
	head[x]=cnt;
}
void ins(int x,int y,int z){
	adde(x,y,z); adde(y,x,z);
}
void dfs(int u,int pr,int d){
	f[u][0]=pr; dep[u]=d;
	for (int i=head[u],v; i; i=e[i].nxt) if ((v=e[i].to)!=pr){
		dfs(v,u,d+1); mx[v][0]=e[i].v;
	}
}
int getmax(int x,int y){
	if (dep[x]<dep[y]) swap(x,y);
	int tmp=dep[x]-dep[y],ret=0;
	per (i,15,0) if (tmp>>i&1) cmax(ret,mx[x][i]),x=f[x][i];
	if (x==y) return ret;
	per (i,15,0) if (f[x][i]!=f[y][i]){
		cmax(ret,mx[x][i]); cmax(ret,mx[y][i]);
		x=f[x][i],y=f[y][i];
	}
	cmax(ret,mx[x][0]); cmax(ret,mx[y][0]);
	return ret;
}
//#define local
int main(){
#ifdef local
	freopen("test.in","r",stdin); freopen("test.out","w",stdout);
#endif
	n=read(); m=read(); X=read();
	rep (i,1,m) a[i].x=read(),a[i].y=read(),a[i].z=read(),a[i].cho=0;
	sort(a+1,a+1+m,cmp);
	rep (i,1,n) fa[i]=i; cur=0;
	rep (i,1,m){
		if (cur==n-1) break;
		int fx=getfa(a[i].x),fy=getfa(a[i].y);
		if (fx!=fy){
			sum+=a[i].z; cur++; fa[fx]=fy; a[i].cho=1;
			ins(a[i].x,a[i].y,a[i].z);
		}
	}
	D=X-sum; if (D<0){ cout<<0; exit(0); }
	dfs(1,0,0);
	rep (j,1,15) rep (i,1,n){
		f[i][j]=f[f[i][j-1]][j-1];
		mx[i][j]=max(mx[i][j-1],mx[f[i][j-1]][j-1]);
	}
	equ=upp=0;
	rep (i,1,m){
		if (a[i].cho) continue;
		int diff=a[i].z-getmax(a[i].x,a[i].y);
		if (diff==D) equ++; if (diff>D) upp++;
	}
	cerr<<"equal number: "<<equ<<endl;
	cerr<<"upper number: "<<upp<<endl;
	if (D==0) ans=(ll)(ksm(2,n-1)+mod-2)*ksm(2,m-n+1)%mod;
	ans=(ans+2ll*(ksm(2,equ)+mod-1)%mod*ksm(2,upp)%mod)%mod;
	cout<<ans<<endl;
	return 0;
}
//sample data:
/*
========
3 3
2
1 2 1
2 3 1
3 1 1

6

========
3 3
3
1 2 1
2 3 1
3 1 2

2

========
5 4
1
1 2 3
1 3 3
2 4 6
2 5 8

0

========
8 10
49
4 6 10
8 4 11
5 8 9
1 8 10
3 8 128773450
7 8 10
4 2 4
3 4 1
3 1 13
5 2 2

4

*/

//rest:
/*
求出任意一个MST，以及它的边权和S。
定义：maxpath(u,v)表示u,v在MST上路径的最大边权；
令diff(e=(u,v))=c-maxpath(u,v)，c表示e这条边的权值；
其中在MST上的边diff=0；显然diff≥0。
记D=X-S，记录diff<D,diff=D,diff>D的边数，分别为x,y,z；
按照D分类讨论：
若D<0则无解；若D>0解个数为2*(2^y-1)*2^z；若D=0解个数为(2^(n-1)-2)*2^(m-n+1)+2*(2^y-1)*2^z。
原因：D>0时，diff<D的边和MST上的边都要同色（2种颜色）；
并且diff=D的边必须至少有一条和MST不同色；diff>D的任意。
D=0时分MST的边同色和不同色两种情况：若同色则与D>0一样；
若不同色，则MST中每条边任意取的情况减去全为0和全为1的两种，
即2^(n-1)-2，剩下的边可以任意取。
*/

Measured memory_bytes: 512