using System;
using System.Collections.Generic;
using static Assistant.Input;
using System.Linq;
using Assistant;
using System.Text;

namespace ABC143E
{
    class Program
    {
        static public long L;

        static void Main(string[] args)
        {
            var N = ReadInt;
            var M = ReadInt;
            L = ReadLong;

            WarshallFloyd wf = new WarshallFloyd(N);
            for (int i = 0; i < M; i++)
            {
                int from = ReadInt - 1;
                int to = ReadInt - 1;
                int c = ReadInt;

                if (c > L) continue;
                wf.AddEdge(from, to, c);
                wf.AddEdge(to, from, c);
            }

            bool negativeCycle;
            var distance = wf.Start(out negativeCycle);

            WarshallFloyd wf2 = new WarshallFloyd(N);
            for (int i = 0; i < N; i++)
            {
                for (int j = 0; j < N; j++)
                {
                    if (distance[i, j] <= L) wf2.AddEdge(i, j, 1);
                }
            }
            bool negativeCycle2;
            var count = wf2.Start(out negativeCycle2);

            var Q = ReadInt;
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < Q; i++)
            {
                int s = ReadInt - 1;
                int t = ReadInt - 1;

                long ans = count[s, t] -1;
                if (ans == long.MaxValue-1) sb.AppendLine("-1");
                else sb.AppendLine(ans.ToString());
            }
            Console.Write(sb);
        }


    }

    /// <summary>
    /// ワーシャルフロイド、負の辺に対応、O(V^3)、全頂点間距離
    /// </summary>
    class WarshallFloyd
    {
        long INF = long.MaxValue;

        int _v;
        long[,] dp;

        public WarshallFloyd(int V)
        {
            _v = V;

            dp = new long[V, V];
            for (int i = 0; i < V; i++)
            {
                for (int j = 0; j < V; j++)
                {
                    if (i != j) dp[i, j] = INF;
                }
            }
        }

        public void AddEdge(int from, int to, long cost)
        {
            dp[from, to] = cost;
        }

        public long[,] Start(out bool negativeCycle)
        {
            negativeCycle = false;
            for (int k = 0; k < _v; k++)
            {
                for (int i = 0; i < _v; i++)
                {
                    for (int j = 0; j < _v; j++)
                    {
                        if (dp[i, k] == long.MaxValue || dp[k, j] == long.MaxValue) continue;
                        dp[i, j] = Math.Min(dp[i, j], dp[i, k] + dp[k, j]);
                    }

                    if (dp[i, i] < 0) negativeCycle = true;
                }
            }

            return dp;
        }

        public long Distance(int from, int to)
        {
            return dp[from, to];
        }
    }


}

namespace Assistant
{
    static class Input
    {
        static List<string> line = new List<string>();
        static int index = 0;
        static String ReadNext()
        {
            if (line.Count <= index) line.AddRange(Console.ReadLine().Split());
            return line[index++];
        }
        public static int ReadInt => int.Parse(ReadNext());
        public static long ReadLong => long.Parse(ReadNext());
        public static int[] ReadInts => Console.ReadLine().Split().Select(int.Parse).ToArray();
        public static long[] NextLongs => Console.ReadLine().Split().Select(long.Parse).ToArray();
    }

    static class Debug
    {
        //drawmap
        //drawarray
    }
}


Measured memory_bytes: 35396