Link to this code: https://cses.fi/paste/b6793d7188371027dbe6eb/
/* 777 */
#include "bits/stdc++.h"
using namespace std;
#define int long long

const int MAX_N = 2e6 + 5, MAX_NN = 505, INF = 4e18;
int N, M, Q, dp[MAX_NN][MAX_NN];

// Floyd–Warshall algorithm -> O(V^3) - APSP
void floyd_warshall() {
    for (int k = 1; k <= N; ++k) {          // intermediate
        for (int i = 1; i <= N; ++i) {      // src
            for (int j = 1; j <= N; ++j) {  // dest
                if (dp[i][k] == INF || dp[k][j] == INF) continue;
                dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j]);
            }
        }
    }
}

void solve() {
    cin >> N >> M >> Q;

    // init
    for (int i = 1; i <= N; ++i) {
        for (int j = 1; j <= N; ++j) dp[i][j] = i == j ? 0 : INF;
    }

    // input + build
    for (int u, v, i = 0; i < M; ++i) {
        int w;
        cin >> u >> v >> w;

        // handle multiple edges between same pair of nodes
        dp[u][v] = min(dp[u][v], w);
        dp[v][u] = min(dp[v][u], w);
    }

    // compute APSP
    floyd_warshall();

    // handle queries
    for (int q = 0; q < Q; ++q) {
        int i, j;
        cin >> i >> j;
        if (dp[i][j] == INF) dp[i][j] = -1;
        cout << dp[i][j] << '\n';
    }
}

int32_t main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    solve();
}