#include<bits/stdc++.h>
#define P 1000000007
#define N 100005
#define M 200005
using namespace std;
int i,j,k,l,s,n,m,s1,tot,last[N],to[M],Next[M],val[N],b[N],q[N],fa[N],dis[N],ans;
long long sum,x;
struct node {
	int x,y,z,v;
}a[N];
inline bool cmp(node x,node y) {
	return x.z<y.z;
}
inline int get(int x) {
	if (fa[x]==x) return x;
	return fa[x]=get(fa[x]);
}
inline void add(int x,int y,int z) {
	Next[++tot]=last[x]; last[x]=tot; to[tot]=y; val[tot]=z;
}
inline void build(int x) {
	int l=0,r=1; dis[q[1]=x]=1;
	while (l<r) {
		int k=q[++l];
		for (int i=last[k];i;i=Next[i]) {
			if (fa[k]==to[i]) continue;
			fa[q[++r]=to[i]]=k;
			b[to[i]]=val[i];
			dis[to[i]]=dis[k]+1;
		}
	}
}
inline int ask(int x,int y) {
	int ans=0;
	while (x!=y) {
		if (dis[x]>dis[y]) ans=max(ans,b[x]),x=fa[x];
		else ans=max(ans,b[y]),y=fa[y];
	}
	return ans;
}
inline int quick(int x,int y) {
	int s=1;
	while (y) {
		if (y&1) s=1ll*s*x%P;
		x=1ll*x*x%P;
		y>>=1;
	}
	return s;
}
int main() {
	scanf("%d%d%lld",&n,&m,&x);
	for (i=1;i<=n;i++) fa[i]=i;
	for (i=1;i<=m;i++) scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
	sort(a+1,a+1+m,cmp);
	for (i=1;i<=m;i++) {
		if (get(a[i].x)==get(a[i].y)) a[i].v=1;
		else add(a[i].x,a[i].y,a[i].z),add(a[i].y,a[i].x,a[i].z),fa[get(a[i].x)]=get(a[i].y),sum+=a[i].z;
	}
	if (sum>x) return puts("0"),0;
	for (i=1;i<=n;i++) fa[i]=0;
	build(1);
	for (i=1;i<=m;i++) {
		if (!a[i].v) a[i].v=-1;
		else a[i].v=a[i].z-ask(a[i].x,a[i].y);
	}
	if (sum==x) {
		for (i=1;i<=m;i++) if (!a[i].v) s++;
		ans=1ll*(quick(2,n-1)-2)*quick(2,m-(n-1))%P;
		ans=(ans+2ll*(quick(2,s)-1)*quick(2,m-(n-1)-s)%P)%P;
		ans=(ans+P)%P;
	}
	else {
		for (i=1;i<=m;i++) if (a[i].v==x-sum) s++;
		else if (a[i].v>x-sum) s1++;
		ans=1ll*2*(quick(2,s)-1)*quick(2,s1)%P;
	}
	printf("%d\n",ans);
} 