-- https://github.com/minoki/my-atcoder-solutions
{-# LANGUAGE BangPatterns #-}
import Data.Char (isSpace)
import Data.List (unfoldr)
import Control.Monad
import qualified Data.Vector as V
import qualified Data.Vector.Mutable as VM
import qualified Data.Vector.Unboxed as U
import qualified Data.ByteString.Char8 as BS
import Data.Array
import Data.Array.ST

addPath :: Int -> (Int, Int) -> (Int, Int) -> (Int, Int)
addPath l (ik_c, ik_f) (kj_c, kj_f)
  | kj_c == 0, l <= ik_f + kj_f = (ik_c, ik_f + kj_f - l) -- k で給油しない場合
  | otherwise = (ik_c + kj_c + 1, kj_f) -- k で給油する場合

checkAssoc l x y z = (addPath l x (addPath l y z), addPath l (addPath l x y) z)

-- 最短距離の (Int, Int) は (給油の回数, 残り燃料（0以上L以下）)
warshallFloyd :: Int -> V.Vector [(Int, Int)] -> Array (Int, Int) (Int, Int)
warshallFloyd !l !graph = runSTArray $ do
  let n = V.length graph
  arr <- newArray ((0,0),(n-1,n-1)) (10^6, 0)
  forM_ [0..n-1] $ \a -> do
    forM_ (graph V.! a) $ \(b,c) -> do
      writeArray arr (a,b) (0, l-c)
      writeArray arr (b,a) (0, l-c)
  forM_ [0..n-1] $ \a -> do
    writeArray arr (a,a) (0,l)
  forM_ [0..n-1] $ \k -> do
    forM_ [0..n-1] $ \i -> do
      forM_ [0..n-1] $ \j -> do
        a_ij <- readArray arr (i,j)
        a_ik@(ik_c, ik_f) <- readArray arr (i,k)
        a_kj@(kj_c, kj_f) <- readArray arr (k,j)
        let a_ikj | kj_c == 0, l <= ik_f + kj_f = (ik_c, ik_f + kj_f - l) -- k で給油しない場合
                  | otherwise = (ik_c + kj_c + 1, kj_f) -- k で給油する場合
        writeArray arr (i,j) $! min a_ij a_ikj
  return arr

main = do
  [n,m,l] <- unfoldr (BS.readInt . BS.dropWhile isSpace) <$> BS.getLine
  edges <- U.replicateM m $ do
    [a,b,c] <- unfoldr (BS.readInt . BS.dropWhile isSpace) <$> BS.getLine
    return (a-1,b-1,c)
  let edges' = U.filter (\(a,b,c) -> c <= l) edges
  let graph :: V.Vector [(Int, Int)]
      graph = V.create $ do
        g <- VM.replicate n []
        U.forM_ edges' $ \(a,b,c) -> do
          VM.modify g ((b,c) :) a
        return g
  let w = warshallFloyd l graph
  q <- readLn
  queries <- U.replicateM q $ do
    [s,t] <- unfoldr (BS.readInt . BS.dropWhile isSpace) <$> BS.getLine
    return (s,t)
  U.forM_ queries $ \(s,t) -> do
    let (c,_) = w ! (s-1,t-1)
    print $ if c >= 10^6 then -1 else c
  return ()
