#include <iostream>
#include <algorithm>
#include <utility>
#include <vector>
#define llint long long
#define mod 1000000007

using namespace std;
typedef pair<llint, llint> P;
typedef pair<llint, P> E;

struct UnionFind{
	int size;
	vector<int> parent;
	
	UnionFind(){}
	UnionFind(int size){
		this->size = size;
		parent.resize(size+1);
		init();
	}
	void init(){
		for(int i = 0; i <= size; i++) parent[i] = i;
	}
	int root(int i){
		if(parent[i] == i) return i;
		return parent[i] = root(parent[i]);
	}
	bool same(int i, int j){
		return root(i) == root(j);
	}
	void unite(int i, int j){
		int root_i = root(i), root_j = root(j);
		if(root_i == root_j) return;
		parent[root_i] = root_j;
	}
};

llint n, m, x;
vector<E> vec;
UnionFind uf(1005);

llint modpow(llint a, llint n)
{
	if(n == 0) return 1;
	if(n % 2){
		return ((a%mod) * (modpow(a, n-1)%mod)) % mod;
	}
	else{
		return modpow((a*a)%mod, n/2) % mod;
	}
}

int main(void)
{
	cin >> n >> m >> x;
	llint u, v, w;
	for(int i = 1; i <= m; i++){
		cin >> u >> v >> w;
		vec.push_back(make_pair(w, make_pair(u, v)));
	}
	sort(vec.begin(), vec.end());
	
	llint mst = 0, mx = 0; uf.init();
	for(int i = 0; i < vec.size(); i++){
		w = vec[i].first, u = vec[i].second.first, v = vec[i].second.second;
		if(uf.same(u, v)) continue;
		uf.unite(u, v);
		mst += w, mx = w;
	}
	if(x < mst){
		cout << 0 << endl;
		return 0;
	}
	
	llint ecnt = 0, ucnt = 0;
	for(int i = 0; i < vec.size(); i++){
		llint sum = 0; uf.init();
		sum += vec[i].first, uf.unite(vec[i].second.first, vec[i].second.second);
		for(int j = 0; j < vec.size(); j++){
			w = vec[j].first, u = vec[j].second.first, v = vec[j].second.second;
			if(uf.same(u, v)) continue;
			uf.unite(u, v);
			sum += w;
		}
		if(sum == x && i != 0) ecnt++;
		if(sum > x) ucnt++;
	}
	
	ecnt = modpow(2, ecnt);
	ecnt += mod-1, ecnt %= mod;
	ucnt = modpow(2, ucnt);
	
	llint ans = ecnt * ucnt % mod;
	ans *= 2, ans %= mod;
	cout << ans << endl;
	
	return 0;
}