// s = 1 のもとで O(Q + (N + M) log N) #include using namespace std; using ll = long long; #ifdef LOCAL #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; vector A(N), W; for (int i = 0; i < N; i++) cin >> A[i], A[i]--; vector>> G(N); for (int i = 0; i < M; i++) { int u, v, w; cin >> u >> v >> w, u--, v--; W.emplace_back(w); G[u].emplace_back(v, w); G[v].emplace_back(u, w); } ranges::sort(W); W.erase(ranges::unique(W).begin(), W.end()); constexpr int INF = (1 << 30) - 1; // dist[i] := 店 i に行くまでに必要な巡礼度 vector dist(N, INF); priority_queue, vector>, greater<>> que; dist[0] = 0; que.emplace(dist[0], 0); while (!que.empty()) { auto [expected, v] = que.top(); que.pop(); if (dist[v] < expected) continue; for (auto [u, w] : G[v]) { int c = max(dist[v], w); if (dist[u] > c) { dist[u] = c; que.emplace(dist[u], u); } } } // ans[i] := 系列 i を取るための最小の巡礼度 vector ans(N, INF); for (int i = 0; i < N; i++) ans[A[i]] = min(ans[A[i]], dist[i]); ranges::sort(ans); auto solve = [&](int s, int c) -> int { return (ans[c - 1] == INF ? -1 : ans[c - 1]); }; while (Q--) { int s, c; cin >> s >> c, s--; assert(s == 0); cout << solve(s, c) << "\n"; } }