#include <bits/stdc++.h>
using namespace std;

#define dump(x) cout << (x) << endl
#define Int int64_t
#define fi first
#define se second

Int mod = 1e9 + 7;
Int INF = 1e18;

Int n, m, l;
Int road1[301][301];
Int road2[301][301];
vector< pair<Int, Int> > G[301];
pair<Int, Int> d[301];
bool visited[301];

void dfs(Int cur) {
    //cout << " " << cur << endl;
    //visited[cur] = true;
    for (Int i = 0; i < G[cur].size(); i++) {
        pair<Int, Int> next;
        if (d[cur].se < G[cur][i].se) {
            next.fi = d[cur].fi + 1;
            next.se = l - G[cur][i].se;
        }
        else {
            next.fi = d[cur].fi;
            next.se = d[cur].se - G[cur][i].se;
        }
        if (d[G[cur][i].fi].fi > next.fi) {
            d[G[cur][i].fi] = next;
            dfs(G[cur][i].fi);
        }
        else if (d[G[cur][i].fi].fi == next.fi && d[G[cur][i].fi].se >= next.se) {
            d[G[cur][i].fi] = next;
            dfs(G[cur][i].fi);
        }
    }
}

int main() {
    cin >> n >> m >> l;
    for (Int i = 0; i < 300; i++) {
        for (Int j = 0; j < 300; j++) {
            road1[i][j] = INF;
            road2[i][j] = INF;
            if (i == j) {
                road1[i][j] = road2[i][j] = 0;
            }
        }
    }
    for (Int i = 0; i < m; i++) {
        Int a, b, c;
        cin >> a >> b >> c;
        a--;
        b--;
        road1[a][b] = road1[b][a] = c;
    }
    for (Int k = 0; k < n; k++) {
        for (Int i = 0; i < n; i++) {
            for (Int j = 0; j < n; j++) {
                road1[i][j] = min(road1[i][j], road1[i][k] + road1[k][j]);
            }
        }
    }
    for (Int i = 0; i < n; i++) {
        for (Int j = 0; j < n; j++) {
            if (i == j) continue;
            if (road1[i][j] <= l) {
                G[i].emplace_back(j, road1[i][j]);
            }
        }
    }
    for (Int i = 0; i < n; i++) {
        for (Int j = 0; j < n; j++) {
            if (i == j) continue;
            if (road1[i][j] <= l) {
                road2[i][j] = 1;
            }
        }
    }
    for (Int k = 0; k < n; k++) {
        for (Int i = 0; i < n; i++) {
            for (Int j = 0; j < n; j++) {
                road2[i][j] = min(road2[i][j], road2[i][k] + road2[k][j]);
            }
        }
    }
    Int q;
    cin >> q;
    for (Int i = 0; i < q; i++) {
        Int s, t;
        cin >> s >> t;
        s--;
        t--;
        dump(road2[s][t] == INF ? -1 : road2[s][t] - 1);
    }
    // for (Int i = 0; i < n; i++) {
    //     for (Int j = 0; j < G[i].size(); j++) {
    //         cout << " " << G[i][j].fi << " ";
    //     }
    //     cout << endl;
    // }
    // Int q;
    // cin >> q;
    // for (Int i = 0; i < q; i++) {
    //     Int s, t;
    //     cin >> s >> t;
    //     s--;
    //     t--;
    //     for (Int j = 0; j < n; j++) {
    //         d[j] = {INF, 0};
    //         visited[j] = false;
    //     }
    //     d[s] = {0, l};
    //     dfs(s);
    //     // for (Int j = 0; j < n; j++) {
    //     //     cout << d[j].fi << " ";
    //     // }
    //     // cout << endl;
    //     dump(d[t].fi == INF ? -1 : d[t].fi);
    // }
    // // vector<Int> d(n, INF);
    // // for (Int i = 0; i < q; i++) {
    // //     for (Int j = 0; j < n; j++) {
    // //         d[i] = INF;
    // //     }
    // //     Int s, t;
    // //     cin >> s >> t;
    // //     d[s] = 0;
    // //     queue<Int> que;
    // //     que.push(s);
    // //     while (!que.empty()) {
    // //         Int x = que.front();
    // //         que.pop();
    // //         for (Int j = 0; j < G[x].size(); j++) {
    // //             pair<Int, Int> to = G[x][i];
    // //             if (d[to.fi] > d[x] + to.se) {
    // //                 d[to.fi] = d[x] + to.se;
    // //                 que.push(to.fi);
    // //             }
    // //         }
    // //     }

    // // }
    return 0;
}

Measured memory_bytes: 4224