#!/usr/bin/env ruby
# coding: utf-8

class PQ
  def initialize
    @queue = []
  end
  def insert(pri, val)
    vec = [pri, val]
    index = @queue.bsearch_index { |x| x[0] > vec[0] }
    if index == nil
      @queue.push(vec)
    else
      @queue.insert(index, vec)
    end
#    $stderr.puts "#{@queue}"
  end
  alias :push :insert
  alias :unshift :insert
  def shift
    ret = @queue.shift
#    $stderr.puts "#{@queue}"
    ret
  end
end

map = Hash.new { |h,k| h[k] = Hash.new }

_, m, l = ARGF.gets.split.map(&:to_i)
m.times do
  a, b, c = ARGF.gets.split.map(&:to_i)
  map[a][b] = c
  map[b][a] = c
end

# map.each do |a,peer|
#   peer.each do |b,cost|
#     $stderr.puts "#{a}->(#{cost})->#{b}"
#   end
# end

route = Hash.new { |h1,k1| h1[k1] = Hash.new { |h2,k2| h2[k2] = Hash.new } }
map.keys.each do |from|
  route[from][from] = { cost: 0, nexthop: from }
  pq = PQ.new
  map[from].each do |nbr, cost|
    pq.insert(cost, [nbr, nbr])
  end
  while vec = pq.shift
    cost1, val = vec
    to, nh = val
    next if route[from][to][:cost] != nil
    route[from][to] = {
      cost: cost1,
      nexthop: nh
    }
    map[to].each do |dst, cost2|
      pq.insert(cost1 + cost2, [dst, nh])
    end
  end
end

# route.each do |a, dst|
#   dst.each do |b, rt|
#     $stderr.puts "#{a} => #{b} nh #{rt[:nexthop]} cost #{rt[:cost]}"
#   end
# end

q = ARGF.gets.to_i
q.times do
  s, t = ARGF.gets.split.map(&:to_i)
  unless route[s].has_key?(t)
    puts -1
    next
  end
  fuel = l
  cur = s
  fill = 0
  while cur != t
    nh = route[cur][t][:nexthop]
    use = map[cur][nh]
    if fuel < use
      fill += 1
      fuel = l
    end
    fuel -= use
    cur = nh
  end
  puts fill
end
