#define _USE_MATH_DEFINES
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <cassert>
#include <string>
#include <vector>
#include <utility>
#include <complex>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <deque>
#include <tuple>
#include <bitset>
#include <limits>
#include <algorithm>
#include <random>
#include <complex>
#include <regex>
using namespace std;
typedef long double ld;
typedef long long ll;
typedef vector<int> vint;
typedef vector<ll> vll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<double, double> pdd;
typedef complex<ld> compd;
#define quickIO()	{cin.tie(0);	cout.sync_with_stdio(false);}
#define reach(i,a)	for(auto i:a)
#define rep(i,n)	for(int i=0;i<(int)n;i++)
#define REP(i,n)	for(int i=0;i<=(int)n;i++)
#define srep(i,a,n)	for(int i=a;i<(int)n;i++)
#define SREP(i,a,n)	for(int i=a;i<=(int)n;i++)
#define rrep(i,n)	for(int i=n-1;i>=0;i--)
#define RREP(i,n)	for(int i=n;i>=0;i--)
#define all(a)	(a).begin(),(a).end()
#define mp(a,b)	make_pair(a,b)
#define mt	make_tuple
#define pb	push_back
#define fst	first
#define scn second
int bitcnt(ll x) {
	x = ((x & 0xAAAAAAAAAAAAAAAA) >> 1) + (x & 0x5555555555555555);
	x = ((x & 0xCCCCCCCCCCCCCCCC) >> 2) + (x & 0x3333333333333333);
	x = ((x & 0xF0F0F0F0F0F0F0F0) >> 4) + (x & 0x0F0F0F0F0F0F0F0F);
	x = ((x & 0xFF00FF00FF00FF00) >> 8) + (x & 0x00FF00FF00FF00FF);
	x = ((x & 0xFFFF0000FFFF0000) >> 16) + (x & 0x0000FFFF0000FFFF);
	x = ((x & 0xFFFFFFFF00000000) >> 32) + (x & 0x00000000FFFFFFFF);
	return x;
}
int bitcnt(int x) {
	x = ((x & 0xAAAAAAAA) >> 1) + (x & 0x55555555);
	x = ((x & 0xCCCCCCCC) >> 2) + (x & 0x33333333);
	x = ((x & 0xF0F0F0F0) >> 4) + (x & 0x0F0F0F0F);
	x = ((x & 0xFF00FF00) >> 8) + (x & 0x00FF00FF);
	x = ((x & 0xFFFF0000) >> 16) + (x & 0x0000FFFF);
	return x;
}
ll gcd(ll a, ll b) {
	return a%b == 0 ? b : gcd(b, a%b);
}
#define debug(x)	cout<<"case #" << x << ": " << endl
#define DEBUG 0
const ll inf = 1e18;
const ll mod = 1e9 + 7;
const ld eps = 1e-15;
const int dx[] = { 1,0,-1,0,0 };
const int dy[] = { 0,1,0,-1,0 };

int n, m;
vector<pair<int, ll>> edge[1010];
vector<tuple<ll, int, int>> e;

int parent[1010];
int findparent(int i) {
	return parent[i] = (i == parent[i] ? i : findparent(parent[i]));
}
void merge(int i, int j) {
	int pi = findparent(i);
	int pj = findparent(j);
	parent[pi] = pj;
	pi = findparent(i);
}

ll getMST(int l) {
	rep(i, n)	parent[i] = i;
	ll ret = 0;
	if (l != -1) {
		ret += get<0>(e[l]);
		merge(get<1>(e[l]), get<2>(e[l]));
	}
	rep(i, m) {
		ll w; int u, v;	tie(w, u, v) = e[i];
		if (findparent(u) != findparent(v)) {
			ret += w;
			merge(u, v);
		}
	}
	return ret;
}

ll modpow(ll a, ll b) {
	ll ret = 1;
	while (b) {
		if (b & 1)	ret = (ret*a) % mod;
		a = (a*a) % mod;
		b >>= 1;
	}
	return ret;
}

int main() {
	cin >> n >> m;
	ll x;	cin >> x;
	rep(i, m) {
		int u, v;	ll w;	cin >> u >> v >> w;
		u--;	v--;
		edge[u].push_back(mp(v,w));
		edge[v].push_back(mp(u,w));
		e.push_back(mt(w, u, v));
	}
	sort(all(e));
	ll mst = getMST(-1);
	if (mst > x) {
		cout << 0 << endl;
		return 0;
	}
	vector<ll> weight(m);
	rep(i, m)	weight[i] = getMST(i);
	if (mst == x) {
		int cnt = 0;
		rep(i, m)	cnt += (weight[i] == x ? 1 : 0);
		ll ret = (modpow(2, cnt) - 2 + mod) % mod;
		cout << (modpow(2, m - cnt) * ret) % mod << endl;
	}
	else {
		int same = 0, onediff = 0, candiff = 0;
		rep(i, m) {
			if (weight[i] < x)	same++;
			else if (weight[i] == x)	onediff++;
			else	candiff++;
		}
		ll ret = (2 * (modpow(2, onediff) - 1 + mod)) % mod;
		cout << (modpow(2, candiff)*ret) % mod << endl;
	}
	return 0;
}

Measured memory_bytes: 384