from collections import defaultdict from collections import deque class UnionFind(): def __init__(self, n): self.n = n self.parents = [-1] * n def find(self, x): if self.parents[x] < 0: return x else: self.parents[x] = self.find(self.parents[x]) return self.parents[x] def union(self, x, y): x = self.find(x) y = self.find(y) if x == y: return if self.parents[x] > self.parents[y]: x, y = y, x self.parents[x] += self.parents[y] self.parents[y] = x def size(self, x): return -self.parents[self.find(x)] def same(self, x, y): return self.find(x) == self.find(y) def members(self, x): root = self.find(x) return [i for i in range(self.n) if self.find(i) == root] def roots(self): return [i for i, x in enumerate(self.parents) if x < 0] def group_count(self): return len(self.roots()) def all_group_members(self): group_members = defaultdict(list) for member in range(self.n): group_members[self.find(member)].append(member) return group_members mod=10**9+7 INF=10**100 n,m,k=map(int,input().split()) edge=[[] for i in range(n)] uf=UnionFind(n) for i in range(m): a,b,c=map(int,input().split()) edge[a-1].append([b-1,c]) edge[b-1].append([a-1,c]) uf.union(a-1,b-1) def f(G): d={} for i in range(len(G)): d[G[i]]=i q=deque() q.append([0,0]) seen=[[INF,INF] for i in range(len(G))] seen[0][0]=0 while q: x=q.pop() for v in edge[G[x[0]]]: V=d[v[0]] W=v[1] if seen[V][(x[1]+1)%2]==INF: if x[1]==0: seen[V][1]=W-seen[x[0]][0] else: seen[V][0]=W-seen[x[0]][1] if seen[V][0]!=INF and seen[V][1]!=INF: if (seen[V][0]+seen[V][1])%2==1: return 0,0 else: return bfs((seen[V][1]-seen[V][0])//2,G) else: q.append([V,(x[1]+1)%2]) else: if x[1]==0: if seen[x[0]][0]+seen[V][1]!=W: return 0,0 else: if seen[x[0]][1]+seen[V][0]!=W: return 0,0 min0=INF min1=INF max0=-INF max1=-INF for i in range(len(G)): if seen[i][0]!=INF: min0=min(min0,seen[i][0]) max0=max(max0,seen[i][0]) if seen[i][1]!=INF: min1=min(min1,seen[i][1]) max1=max(max1,seen[i][1]) return max(min(k-max0,min1-1)-max(1-min0,max1-k,0)+1,0),max(min((k-1)-max0,min1-1)-max(1-min0,max1-(k-1),0)+1,0) def bfs(a,g): seen2=[INF]*len(g) seen2[0]=a d2={} for i in range(len(g)): d2[g[i]]=i q2=deque() q2.append(0) flag=True while q2: y=q2.pop() for vertex2 in edge[g[y]]: V2=d2[vertex2[0]] W2=vertex2[1] if seen2[V2]==INF: seen2[V2]=W2-seen2[y] q2.append(V2) else: if seen2[V2]!=W2-seen2[y]: flag=False num1=0 num2=0 if flag and min(seen2)>0 and max(seen2)<=k: num1=1 if flag and min(seen2)>0 and max(seen2)<=k-1: num2=1 return num1,num2 cnt1=1 cnt2=1 for i in list(uf.all_group_members().values()): a,b=f(i) cnt1*=a cnt2*=b cnt1=cnt1%mod cnt2=cnt2%mod print((cnt1-cnt2)%mod)