import sys input = sys.stdin.buffer.readline sys.setrecursionlimit(10 ** 7) mod = 10 ** 9 + 7 class UF_tree: def __init__(self, n): self.root = [-1] * (n + 1) self.rank = [0] * (n + 1) def find(self, x): if self.root[x] < 0: return x self.root[x] = self.find(self.root[x]) return self.root[x] def isSame(self, x, y): return self.find(x) == self.find(y) def unite(self, x, y): x = self.find(x) y = self.find(y) if x == y: return False if self.rank[x] < self.rank[y]: self.root[y] += self.root[x] self.root[x] = y else: self.root[x] += self.root[y] self.root[y] = x if self.rank[x] == self.rank[y]: self.rank[x] += 1 return True def size(self, x): return -self.root[self.find(x)] N, M, X = map(int, input().split()) uf = UF_tree(N) G = [[] for _ in range(N)] for _ in range(M): a, b, c = map(int, input().split()) a -= 1 b -= 1 if uf.unite(a, b): G[a].append((b, c)) G[b].append((a, c)) topo = [] par = [-1] * N que = [0] while que: s = que.pop() topo.append(s) for t, k in G[s]: if par[t] != -1: continue par[t] = (s, k) que.append(t) topo.reverse() ans = 0 size = [1] * N for s in topo[:-1]: p, k = par[s] ans += size[s] * (N - size[s]) * pow(X, k, mod) % mod ans %= mod size[p] += size[s] print(ans)