using System;
using System.Linq;
using System.Collections.Generic;
using static System.Console;
using System.Text;
using System.IO;
using static System.Math;
namespace AtCoder
{
    class Program
    {
        static public long[] Sarray() { return ReadLine().Split().Select(long.Parse).ToArray(); }
        static public List<long> Slist() { return ReadLine().Split().Select(long.Parse).ToList(); }

        static readonly long Mod = 1000000000 + 7;

        static void Main(string[] args)
        {
            var NML = Sarray();
            var N = NML[0];
            var M = NML[1];
            var L = NML[2];

            var G = new long[N].Select(_ => new List<KeyValuePair<long, long>>()).ToArray();
            for (var i = 0; i < M; ++i)
            {
                var ABC = Sarray();
                var A = ABC[0] - 1;
                var B = ABC[1] - 1;
                var C = ABC[2];
                if (L < C) continue;
                G[A].Add(new KeyValuePair<long, long>(B, C));
                G[B].Add(new KeyValuePair<long, long>(A, C));
            }
            var Q = Sarray()[0];
            ANS = new long[N].Select(_ => new long[N]).ToArray();
            for (var i = 0; i < N; ++i) for (var j = 0; j < N; ++j) ANS[i][j] = long.MaxValue;
            for (var i = 0; i < N; ++i)
                dijkstra(i, G, L);
            SetOut(new StreamWriter(OpenStandardOutput()) { AutoFlush = false });
            for (var i = 0; i < Q; ++i)
            {
                var st = Sarray();
                var s = st[0] - 1;
                var t = st[1] - 1;
                if (long.MaxValue <= ANS[s][t])
                    WriteLine(-1);
                else
                    WriteLine(ANS[s][t]);
            }
            Out.Flush();
        }
        static long[][] ANS;

        static readonly int WHITE = 0;
        static readonly int GRAY = 1;
        static readonly int BLACK = 2;
        static void dijkstra(long root, List<KeyValuePair<long, long>>[] M, long L)
        {
            var n = M.Length;
            long minv = 0;
            long maxl = 0;
            var liq = new long[n].Select(_ => long.MinValue).ToArray();
            liq[root] = L;
            ANS[root][root] = 0;
            var color = new long[n].Select(_ => WHITE).ToArray();
            color[root] = GRAY;
            while (true)
            {
                minv = long.MaxValue;
                maxl = long.MinValue;
                var u = -1;
                for (var i = 0; i < n; ++i)
                {
                    if (color[i] == GRAY && (ANS[root][i] < minv || (ANS[root][i] == minv && maxl < liq[i])))
                    {
                        u = i;
                        minv = ANS[root][i];
                        maxl = liq[i];
                    }
                }
                if (-1 == u) break;
                color[u] = BLACK;
                foreach (var kv in M[u])
                {
                    var ky = kv.Key;
                    var vl = kv.Value;
                    if (color[ky] == BLACK) continue;
                    var tliq = liq[u] - vl;
                    var num = ANS[root][u];
                    if (tliq < 0)
                    {
                        ++num;
                        tliq = L - vl;
                    }
                    if (num < ANS[root][ky] || (num == ANS[root][ky] && liq[ky] < tliq))
                    {
                        ANS[root][ky] = num;
                        liq[ky] = tliq;
                        color[ky] = GRAY;
                    }
                }
            }
            return;
        }
    }
}

Measured memory_bytes: 26020