// O(N^3 + QN log N) #include using namespace std; using ll = long long; #ifdef LOCAL #include #include #else #define debug(...) #endif int main() { cin.tie(nullptr); ios::sync_with_stdio(false); cout << fixed << setprecision(20); int N, M, Q; cin >> N >> M >> Q; assert(N <= 1000 && M <= 1000 && Q <= 5000); vector A(N), W; for (int i = 0; i < N; i++) cin >> A[i]; constexpr int INF = (1 << 30) - 1; vector dist(N, vector(N, INF)); for (int i = 0; i < N; i++) dist[i][i] = 0; for (int i = 0; i < M; i++) { int u, v, w; cin >> u >> v >> w, u--, v--; dist[u][v] = dist[v][u] = w; W.emplace_back(w); } vector S(Q), C(Q); for (int i = 0; i < Q; i++) cin >> S[i] >> C[i], S[i]--; ranges::sort(W); W.erase(ranges::unique(W).begin(), W.end()); for (int k = 0; k < N; k++) { for (int from = 0; from < N; from++) { for (int to = 0; to < N; to++) { if (dist[from][k] == INF || dist[k][to] == INF) continue; dist[from][to] = min(dist[from][to], max(dist[from][k], dist[k][to])); } } } auto solve = [&](int s, int c) -> int { if (c == 1) return 0; // 店 s 到達で ok int ok = ssize(W), ng = -1; while (ok - ng > 1) { int mid = midpoint(ok, ng); unordered_set K; for (int t = 0; t < N; t++) { if (dist[s][t] <= W[mid]) K.emplace(A[t]); } (ssize(K) >= c ? ok : ng) = mid; } return (ok == ssize(W) ? -1 : W[ok]); }; for (int i = 0; i < Q; i++) cout << solve(S[i], C[i]) << "\n"; }