#include<bits/stdc++.h>

using namespace std;
const int maxn=305;
typedef long long ll;
ll mp[305][305];
ll dis[305][305];
ll dp[maxn][maxn];
const ll inf=1e17+5;
int main()
{
    int n,m,l;
    int a,b,c;
    cin>>n>>m>>l;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(i==j)
            {
                mp[i][j]=0;
                dp[i][j]=0;
            }

            else
            {
                mp[i][j]=inf;
                dp[i][j]=inf;
            }

        }
    }
    for(int i=0;i<m;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        mp[a][b]=c;
        mp[b][a]=c;
    }
    for(int k=1;k<=n;k++)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
//                if(mp[i][k]<=l&&mp[i][k]>0&&mp[k][j]<=l&&mp[k][j]>0)
//                {
//                    dp[i][j]=min(2LL,dp[i][j]);
//                }
                if(mp[i][k]<=l&&mp[i][k]>0)
                {
                    dp[i][j]=min(dp[k][j]+1,dp[i][j]);
                }
                if(mp[k][j]<=l&&mp[k][j]>0)
                {
                    dp[i][j]=min(dp[i][k]+1,dp[i][j]);
                }
                dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);

            }
        }
    }
    for(int k=1;k<=n;k++)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
//                if(mp[i][k]<=l&&mp[i][k]>0&&mp[k][j]<=l&&mp[k][j]>0)
//                {
//                    dp[i][j]=min(2LL,dp[i][j]);
//                }
                if(mp[i][k]<=l&&mp[i][k]>0)
                {
                    dp[i][j]=min(dp[k][j]+1,dp[i][j]);
                }
                if(mp[k][j]<=l&&mp[k][j]>0)
                {
                    dp[i][j]=min(dp[i][k]+1,dp[i][j]);
                }
                dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);
            }
        }
    }
    for(int k=1;k<=n;k++)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
                //                if(mp[i][k]<=l&&mp[i][k]>0&&mp[k][j]<=l&&mp[k][j]>0)
                //                {
                //                    dp[i][j]=min(2LL,dp[i][j]);
                //                }
                if(mp[i][k]<=l&&mp[i][k]>0)
                {
                    dp[i][j]=min(dp[k][j]+1,dp[i][j]);
                }
                if(mp[k][j]<=l&&mp[k][j]>0)
                {
                    dp[i][j]=min(dp[i][k]+1,dp[i][j]);
                }
                dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);

            }
        }
    }
    for(int k=1;k<=n;k++)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
                //                if(mp[i][k]<=l&&mp[i][k]>0&&mp[k][j]<=l&&mp[k][j]>0)
                //                {
                //                    dp[i][j]=min(2LL,dp[i][j]);
                //                }
                if(mp[i][k]<=l&&mp[i][k]>0)
                {
                    dp[i][j]=min(dp[k][j]+1,dp[i][j]);
                }
                if(mp[k][j]<=l&&mp[k][j]>0)
                {
                    dp[i][j]=min(dp[i][k]+1,dp[i][j]);
                }
                dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);

            }
        }
    }
    int q;
    cin>>q;
    while(q--)
    {
        scanf("%d%d",&a,&b);
        if(dp[a][b]>=inf-2)
            printf("-1\n");
        else
        {
            ll ans=0;
            ans=max(ans,dp[a][b]-1);
            printf("%lld\n",ans);
        }

    }
    return 0;
}

Measured memory_bytes: 1920