import sys
input = sys.stdin.readline

def I(): return int(input())
def MI(): return map(int, input().split())
def LI(): return list(map(int, input().split()))


"""
全点対探索 & Nが小さいのでワーシャルフロイド．クエリも多めだし
合計距離から補給の回数をうまく計算するのは難しい，
残燃料を持つのも厳しい．
距離バージョンではなくて補給回数バージョンで新しいグラフとか作りたい

新しいグラフは距離がL以下の全点に対してならコスト1の辺を結ぶ．
最初からLあるのでコスト-1

"""
def main():
    
    def warshall_floyd(d):
        #d[i][j]: iからjへの最短距離
        N=len(d)
        for k in range(N):
            for i in range(N):
                for j in range(N):
                    d[i][j] = min(d[i][j],d[i][k] + d[k][j])
        return d
    
    mod=10**9+7
    N,M,L=MI()
    inf = 10**12
    d=[[inf]*N for _ in range(N)]
    for i in range(M):
        a,b,c=MI()
        a-=1
        b-=1
        d[a][b]=c
        d[b][a]=c
        
    d=warshall_floyd(d)
    
    nd=[[inf]*N for _ in range(N)] # 距離がL以下ならコスト1で結ぶ
    
    for i in range(N):
        for j in range(N):
            if d[i][j]<=L:
                nd[i][j]=1
    
    nd =warshall_floyd(nd)
    
    Q=I()
    for _ in range(Q):
        s,t=MI()
        s-=1
        t-=1
        ans=nd[s][t]
        if ans >= inf:
            ans=0
        print(ans-1)
        
    
    
    
main() import sys sys input = sys.stdin.readline input sys.stdin.readline sys.stdin sys stdin readline def I(): return int(input()) I def MI(): return map(int, input().split()) MI def LI(): return list(map(int, input().split())) LI """
全点対探索 & Nが小さいのでワーシャルフロイド．クエリも多めだし
合計距離から補給の回数をうまく計算するのは難しい，
残燃料を持つのも厳しい．
距離バージョンではなくて補給回数バージョンで新しいグラフとか作りたい

新しいグラフは距離がL以下の全点に対してならコスト1の辺を結ぶ．
最初からLあるのでコスト-1

""" def main():
    
    def warshall_floyd(d):
        #d[i][j]: iからjへの最短距離
        N=len(d)
        for k in range(N):
            for i in range(N):
                for j in range(N):
                    d[i][j] = min(d[i][j],d[i][k] + d[k][j])
        return d
    
    mod=10**9+7
    N,M,L=MI()
    inf = 10**12
    d=[[inf]*N for _ in range(N)]
    for i in range(M):
        a,b,c=MI()
        a-=1
        b-=1
        d[a][b]=c
        d[b][a]=c
        
    d=warshall_floyd(d)
    
    nd=[[inf]*N for _ in range(N)] # 距離がL以下ならコスト1で結ぶ
    
    for i in range(N):
        for j in range(N):
            if d[i][j]<=L:
                nd[i][j]=1
    
    nd =warshall_floyd(nd)
    
    Q=I()
    for _ in range(Q):
        s,t=MI()
        s-=1
        t-=1
        ans=nd[s][t]
        if ans >= inf:
            ans=0
        print(ans-1)
        
    
    
     main def warshall_floyd(d):
        #d[i][j]: iからjへの最短距離
        N=len(d)
        for k in range(N):
            for i in range(N):
                for j in range(N):
                    d[i][j] = min(d[i][j],d[i][k] + d[k][j])
        return d
    
     warshall_floyd N=len(d) N len(d) len d for k in range(N):
            for i in range(N):
                for j in range(N):
                    d[i][j] = min(d[i][j],d[i][k] + d[k][j])
         k range(N) range N for i in range(N):
                for j in range(N):
                    d[i][j] = min(d[i][j],d[i][k] + d[k][j])
         i range(N) range N for j in range(N):
                    d[i][j] = min(d[i][j],d[i][k] + d[k][j])
         j range(N) range N d[i][j] = min(d[i][j],d[i][k] + d[k][j]) d[i][j] [i] d i j min(d[i][j],d[i][k] + d[k][j]) min d[i][j] [i] d i j d[i][k] + d[k][j] d[i][k] [i] d i k d[k][j] [k] d k j return d d d d mod=10**9+7 mod 10**9+7 10**9 10 9 7 N,M,L=MI() N MI() MI M L inf = 10**12 inf 10**12 10 12 [inf]*N for _ in range(N) for _ in range(N) _ range(N) range N for _ in range(N) [inf]*N [inf] inf N d=[[inf]*N for _ in range(N)] d [[inf]*N for _ in range(N)] for i in range(M):
        a,b,c=MI()
        a-=1
        b-=1
        d[a][b]=c
        d[b][a]=c
        
     i range(M) range M a,b,c=MI() a MI() MI b c a-=1 a 1 b-=1 b 1 d[a][b]=c d[a][b] [a] d a b c d[b][a]=c d[b][a] [b] d b a c d=warshall_floyd(d) d warshall_floyd(d) warshall_floyd d [inf]*N for _ in range(N) for _ in range(N) _ range(N) range N for _ in range(N) [inf]*N [inf] inf N nd=[[inf]*N for _ in range(N)] nd [[inf]*N for _ in range(N)] for i in range(N):
        for j in range(N):
            if d[i][j]<=L:
                nd[i][j]=1
    
     i range(N) range N for j in range(N):
            if d[i][j]<=L:
                nd[i][j]=1
    
     j range(N) range N if d[i][j]<=L:
                nd[i][j]=1
    
     d[i][j]<=L d[i][j] [i] d i j L nd[i][j]=1 nd[i][j] [i] nd i j 1 nd =warshall_floyd(nd) nd warshall_floyd(nd) warshall_floyd nd Q=I() Q I() I for _ in range(Q):
        s,t=MI()
        s-=1
        t-=1
        ans=nd[s][t]
        if ans >= inf:
            ans=0
        print(ans-1)
        
    
    
     _ range(Q) range Q s,t=MI() s MI() MI t s-=1 s 1 t-=1 t 1 ans=nd[s][t] ans nd[s][t] [s] nd s t if ans >= inf:
            ans=0
         ans >= inf ans inf ans=0 ans 0 print(ans-1) print ans-1 ans 1 main() main input = sys.stdin.readline sys.stdin.readline input def main():
    
    def warshall_floyd(d):
        #d[i][j]: iからjへの最短距離
        N=len(d)
        for k in range(N):
            for i in range(N):
                for j in range(N):
                    d[i][j] = min(d[i][j],d[i][k] + d[k][j])
        return d
    
    mod=10**9+7
    N,M,L=MI()
    inf = 10**12
    d=[[inf]*N for _ in range(N)]
    for i in range(M):
        a,b,c=MI()
        a-=1
        b-=1
        d[a][b]=c
        d[b][a]=c
        
    d=warshall_floyd(d)
    
    nd=[[inf]*N for _ in range(N)] # 距離がL以下ならコスト1で結ぶ
    
    for i in range(N):
        for j in range(N):
            if d[i][j]<=L:
                nd[i][j]=1
    
    nd =warshall_floyd(nd)
    
    Q=I()
    for _ in range(Q):
        s,t=MI()
        s-=1
        t-=1
        ans=nd[s][t]
        if ans >= inf:
            ans=0
        print(ans-1)
        
    
    
     def main():
    
    def warshall_floyd(d):
        #d[i][j]: iからjへの最短距離
        N=len(d)
        for k in range(N):
            for i in range(N):
                for j in range(N):
                    d[i][j] = min(d[i][j],d[i][k] + d[k][j])
        return d
    
    mod=10**9+7
    N,M,L=MI()
    inf = 10**12
    d=[[inf]*N for _ in range(N)]
    for i in range(M):
        a,b,c=MI()
        a-=1
        b-=1
        d[a][b]=c
        d[b][a]=c
        
    d=warshall_floyd(d)
    
    nd=[[inf]*N for _ in range(N)] # 距離がL以下ならコスト1で結ぶ
    
    for i in range(N):
        for j in range(N):
            if d[i][j]<=L:
                nd[i][j]=1
    
    nd =warshall_floyd(nd)
    
    Q=I()
    for _ in range(Q):
        s,t=MI()
        s-=1
        t-=1
        ans=nd[s][t]
        if ans >= inf:
            ans=0
        print(ans-1)
        
    
    
     main def I(): return int(input()) def I(): return int(input()) I def LI(): return list(map(int, input().split())) def LI(): return list(map(int, input().split())) LI def MI(): return map(int, input().split()) def MI(): return map(int, input().split()) MI
import sys
input = sys.stdin.readline

def I(): return int(input())
def MI(): return map(int, input().split())
def LI(): return list(map(int, input().split()))


"""
全点対探索 & Nが小さいのでワーシャルフロイド．クエリも多めだし
合計距離から補給の回数をうまく計算するのは難しい，
残燃料を持つのも厳しい．
距離バージョンではなくて補給回数バージョンで新しいグラフとか作りたい

新しいグラフは距離がL以下の全点に対してならコスト1の辺を結ぶ．
最初からLあるのでコスト-1

"""
def main():
    
    def warshall_floyd(d):
        #d[i][j]: iからjへの最短距離
        N=len(d)
        for k in range(N):
            for i in range(N):
                for j in range(N):
                    d[i][j] = min(d[i][j],d[i][k] + d[k][j])
        return d
    
    mod=10**9+7
    N,M,L=MI()
    inf = 10**12
    d=[[inf]*N for _ in range(N)]
    for i in range(M):
        a,b,c=MI()
        a-=1
        b-=1
        d[a][b]=c
        d[b][a]=c
        
    d=warshall_floyd(d)
    
    nd=[[inf]*N for _ in range(N)] # 距離がL以下ならコスト1で結ぶ
    
    for i in range(N):
        for j in range(N):
            if d[i][j]<=L:
                nd[i][j]=1
    
    nd =warshall_floyd(nd)
    
    Q=I()
    for _ in range(Q):
        s,t=MI()
        s-=1
        t-=1
        ans=nd[s][t]
        if ans >= inf:
            ans=0
        print(ans-1)
        
    
    
    
main()
