## https://yukicoder.me/problems/no/1502 from collections import deque MOD = 10 ** 9 + 7 def solve(N, M, K, next_nodes): if K == 0: return 0 passed = [False] * N polyes = [None for _ in range(N)] ranges = [[1, K] for _ in range(N)] answer = 1 for s_i in range(N): if not passed[s_i]: queue = deque() queue.append(s_i) polyes[s_i] = (1, 0) array = [] while len(queue) > 0: v = queue.popleft() for w, z in next_nodes[v]: if not passed[w]: polyes[w] = (-1 * polyes[v][0], z - 1 * polyes[v][1]) passed[w] = True array.append(w) queue.append(w) else: if polyes[v][0] != polyes[w][0]: if polyes[v][1] + polyes[w][1] == z: continue else: return 0 elif polyes[v][0] == polyes[w][0]: X = z - polyes[v][1] - polyes[w][1] X *= polyes[v][0] if X % 2 == 0: x0 = X // 2 if ranges[s_i][0] <= x0 <= ranges[s_i][1]: ranges[s_i][0] = x0 ranges[s_i][1] = x0 continue else: return 0 else: return 0 # 範囲を計算 x_min, x_max = ranges[s_i] for w in array: if polyes[w][0] == 1: x_min = max(x_min, ranges[w][0] - polyes[w][1]) x_max = min(x_max, ranges[w][1] - polyes[w][1]) else: x_min =max(x_min, polyes[w][1] - ranges[w][1]) x_max = min(x_max, polyes[w][1] - ranges[w][0]) if x_min <= x_max: answer *= (x_max - x_min + 1) % MOD answer %= MOD else: return 0 return answer def main(): N, M, K = map(int, input().split()) next_nodes = [[] for _ in range(N)] for _ in range(M): x, y, z = map(int, input().split()) next_nodes[x - 1].append((y - 1, z)) next_nodes[y - 1].append((x - 1, z)) ans1 = solve(N, M, K, next_nodes) ans2 = solve(N, M, K - 1, next_nodes) answer = (ans1 - ans2) % MOD print(answer) if __name__ == "__main__": main()