import heapq from collections import defaultdict INF = pow(10, 20) # 無限大とする値。距離や頂点数から考えて十分大きい値にすること N, M,p,y = map(int, input().split()) # N:頂点数 M:入力辺数 edge = [set() for _ in range(N + 1)] # edge[i]:頂点iから出ている辺 for i in range(M): A, B, C = map(int, input().split()) # A:出発元頂点番号 B:行先頂点番号 C:重み edge[A].add((B, C)) # (同一頂点に向かう辺は1本であることが問題文で保証されていない場合は、最短辺のみが残るように工夫すること) edge[B].add((A, C)) # 無向グラフなので逆側にも入れる dist = [INF for _ in range(N + 1)] # 始点から当該頂点までの最短距離。各頂点に対し無限大で初期化。 dist[1] = 0 # 始点から始点の距離なので当然0 prev_node = [-1 for _ in range(N + 1)] # 始点から当該頂点までの最短距離時の直前頂点。各頂点に対し、prev(v)←無し。これを辿れば最短経路が求まる hq = [(0, 1)] # 優先度付きキューに(始点からの距離,始点の頂点番号)を追加 # ↑何を優先して探索させるかを十分に検討して、入れる要素の順番を決めること。間違えるとTLEする!!! heapq.heapify(hq) while len(hq) != 0: d, u = heapq.heappop(hq) # 優先度付きキューから始点に近い側から頂点を取り出し if dist[u] == d: # (Q(v)←altではなく、更新毎に追加しているので、不要パターンがある。最短の場合のみ処理) for v, C in edge[u]: # 取り出した頂点から出ている全ての辺に対して new_d = d + C # 新規の距離を計算し if dist[v] > new_d: # 短くなっていたら更新 dist[v] = new_d prev_node[v] = u heapq.heappush(hq, (new_d, v)) # 更新したところの接続点は短くなる可能性があるので再調査 D=defaultdict(int) for _ in range(p): d,e=map(int,input().split()) D[d]=e ans=0 for i in range(1,N+1): if dist[i]!=INF and D[i]!=0: ans=max(ans,(y-dist[i])//D[i]) print(ans)