#include #include using namespace std; using ll = long long; #define rep(i, n) for (int i = 0; i < (n); i++) template void dedup(vector& a) { sort(a.begin(), a.end()); a.erase(unique(a.begin(), a.end()), a.end()); } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N, M, Q; cin >> N >> M >> Q; vector A(N); rep(i, N) cin >> A[i]; vector> ES; rep(i, M) { int a, b, c; cin >> a >> b >> c; a--, b--; ES.push_back({c, a, b}); } vector V(Q), U(Q); rep(i, Q) { cin >> V[i] >> U[i]; V[i]--; } vector ANS(Q, -1); sort(ES.begin(), ES.end()); atcoder::dsu uf(N); vector> S(N); using TT = pair; vector, std::greater<>>> T(N); rep(i, N) S[i].push_back(A[i]); rep(i, Q) { if (U[i] == 1) ANS[i] = 0; else { T[V[i]].push({U[i], i}); } } for (auto [c, a, b] : ES) { a = uf.leader(a), b = uf.leader(b); if (a == b) continue; int n = uf.merge(a, b); int o = n ^ a ^ b; if (S[n].size() < S[o].size()) swap(S[n], S[o]); rep(i, S[o].size()) S[n].push_back(S[o][i]); if (T[n].size() < T[o].size()) swap(T[n], T[o]); while (T[o].size()) T[n].push(T[o].top()), T[o].pop(); S[o].clear(); dedup(S[n]); int s = S[n].size(); while (T[n].size() && T[n].top().first <= s) { ANS[T[n].top().second] = c; T[n].pop(); } } rep(i, Q) cout << ANS[i] << "\n"; }