
from scipy.sparse.csgraph import floyd_warshall as fw
N, M, L = map(int, input().split())

# 町間の道の長さのマトリックスを初期値無限で作成
S = [[float("INF") for i in range(N)] for i in range(N)]

# 町間の道の長さ情報をマトリックスに入力
for i in range(M):
    a, b, c = map(int,input().split())
    S[a-1][b-1] = c
    S[b-1][a-1] = c


# ワーシャルフロイド法で最短距離のマップを生成
Sf = fw(S)

T = [[float("INF")for i in range(N)] for i in range(N)]

# 町間を補給なしで通行可能な場合は1、不可能な場合はINFとしてマトリックスを作成
# （町間距離がタンク容量より大きい場合は通行不可）
for i in range(N):
    for j in range(N):
        if Sf[i][j] <= L:
            T[i][j] = 1

# ワーシャルフロイド法で町間移動可否のマップを生成
# すぐ上のfor文で、補給なしで移動できない町間の移動コストはINFにしたが、
# この処理で複数回の補給を行えば移動できる距離を
Tf = fw(T)

for i in range(int(input())):
    a, b = map(int, input().split())
    if Tf[a-1][b-1] != float("INF"):
        print(int(Tf[a-1][b-1])-1)
    else:
        print(-1) from scipy.sparse.csgraph import floyd_warshall as fw N, M, L = map(int, input().split()) N map(int, input().split()) map int input().split() ().split () input split M L [float("INF") for i in range(N)] for i in range(N) for i in range(N) i range(N) range N for i in range(N) [float("INF") for i in range(N)] S = [[float("INF") for i in range(N)] for i in range(N)] S [[float("INF") for i in range(N)] for i in range(N)] for i in range(M):
    a, b, c = map(int,input().split())
    S[a-1][b-1] = c
    S[b-1][a-1] = c


# ワーシャルフロイド法で最短距離のマップを生成 i range(M) range M a, b, c = map(int,input().split()) a map(int,input().split()) map int input().split() ().split () input split b c S[a-1][b-1] = c S[a-1][b-1] [a-1] S a-1 a 1 b-1 b 1 c S[b-1][a-1] = c S[b-1][a-1] [b-1] S b-1 b 1 a-1 a 1 c Sf = fw(S) Sf fw(S) fw S [float("INF")for i in range(N)] for i in range(N) for i in range(N) i range(N) range N for i in range(N) [float("INF")for i in range(N)] T = [[float("INF")for i in range(N)] for i in range(N)] T [[float("INF")for i in range(N)] for i in range(N)] for i in range(N):
    for j in range(N):
        if Sf[i][j] <= L:
            T[i][j] = 1

# ワーシャルフロイド法で町間移動可否のマップを生成
# すぐ上のfor文で、補給なしで移動できない町間の移動コストはINFにしたが、
# この処理で複数回の補給を行えば移動できる距離を i range(N) range N for j in range(N):
        if Sf[i][j] <= L:
            T[i][j] = 1

# ワーシャルフロイド法で町間移動可否のマップを生成
# すぐ上のfor文で、補給なしで移動できない町間の移動コストはINFにしたが、
# この処理で複数回の補給を行えば移動できる距離を j range(N) range N if Sf[i][j] <= L:
            T[i][j] = 1

# ワーシャルフロイド法で町間移動可否のマップを生成
# すぐ上のfor文で、補給なしで移動できない町間の移動コストはINFにしたが、
# この処理で複数回の補給を行えば移動できる距離を Sf[i][j] <= L Sf[i][j] [i] Sf i j L T[i][j] = 1 T[i][j] [i] T i j 1 Tf = fw(T) Tf fw(T) fw T for i in range(int(input())):
    a, b = map(int, input().split())
    if Tf[a-1][b-1] != float("INF"):
        print(int(Tf[a-1][b-1])-1)
    else:
        print(-1) i range(int(input())) range int(input()) int input() input a, b = map(int, input().split()) a map(int, input().split()) map int input().split() ().split () input split b if Tf[a-1][b-1] != float("INF"):
        print(int(Tf[a-1][b-1])-1)
    else:
        print(-1) Tf[a-1][b-1] != float("INF") Tf[a-1][b-1] [a-1] Tf a-1 a 1 b-1 b 1 float("INF") float "INF" print(int(Tf[a-1][b-1])-1) print int(Tf[a-1][b-1])-1 int(Tf[a-1][b-1]) int Tf[a-1][b-1] [a-1] Tf a-1 a 1 b-1 b 1 1 print(-1) print -1 c = map(int,input().split()) map(int,input().split()) c a, b = map(int, input().split()) map(int, input().split()) a N, M, L = map(int, input().split()) map(int, input().split()) N a, b, c = map(int,input().split()) map(int,input().split()) a b, c = map(int,input().split()) map(int,input().split()) b Sf = fw(S) fw(S) Sf L = map(int, input().split()) map(int, input().split()) L b = map(int, input().split()) map(int, input().split()) b S = [[float("INF") for i in range(N)] for i in range(N)] [[float("INF") for i in range(N)] for i in range(N)] S Tf = fw(T) fw(T) Tf T = [[float("INF")for i in range(N)] for i in range(N)] [[float("INF")for i in range(N)] for i in range(N)] T M, L = map(int, input().split()) map(int, input().split()) M

from scipy.sparse.csgraph import floyd_warshall as fw
N, M, L = map(int, input().split())

# 町間の道の長さのマトリックスを初期値無限で作成
S = [[float("INF") for i in range(N)] for i in range(N)]

# 町間の道の長さ情報をマトリックスに入力
for i in range(M):
    a, b, c = map(int,input().split())
    S[a-1][b-1] = c
    S[b-1][a-1] = c


# ワーシャルフロイド法で最短距離のマップを生成
Sf = fw(S)

T = [[float("INF")for i in range(N)] for i in range(N)]

# 町間を補給なしで通行可能な場合は1、不可能な場合はINFとしてマトリックスを作成
# （町間距離がタンク容量より大きい場合は通行不可）
for i in range(N):
    for j in range(N):
        if Sf[i][j] <= L:
            T[i][j] = 1

# ワーシャルフロイド法で町間移動可否のマップを生成
# すぐ上のfor文で、補給なしで移動できない町間の移動コストはINFにしたが、
# この処理で複数回の補給を行えば移動できる距離を
Tf = fw(T)

for i in range(int(input())):
    a, b = map(int, input().split())
    if Tf[a-1][b-1] != float("INF"):
        print(int(Tf[a-1][b-1])-1)
    else:
        print(-1)
