def wf(d)
	n = d.size
	k = 0
	n.times{|k|
		dk = d[k]
		n.times{|i|
			di = d[i]
			dik = i<k ? di[k] : dk[i]
			lim = i>k ? i : k
			j = n-1
			while j>lim
				di[j] = dik + dk[j] if di[j] > dik + dk[j]
				j -= 1
			end
			while j>i
				di[j] = dik + d[j][k] if di[j] > dik + d[j][k]
				j -= 1
			end
		}
	}
	n.times{|i|
		di = d[i]
		j = i-1
		while j >= 0
			di[j] = d[j][i]
			j -= 1
		end
	}
end

INF = 1000000010

def inittbl(n)
	t = Array.new(n){Array.new(n, INF)}
	n.times{|i| t[i][i] = 0 }
	return t
end

n, m, l = gets.split.map(&:to_i)
d = inittbl(n)
m.times{
	a, b, c = gets.split.map(&:to_i)
	d[a - 1][b - 1] = d[b - 1][a - 1] = c
}
wf(d)
e = inittbl(n)
n.times{|i|
	n.times{|j|
		e[i][j] = 1 if d[i][j] <= l
	}
}
wf(e)
q = gets.to_i
q.times{
	s, t = gets.split.map{|x|x.to_i - 1}
	puts (e[s][t] >= INF ? -1 : e[s][t] - 1)
}
