#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O3")
#pragma GCC optimize("O1")
#pragma GCC optimize("O1")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#define int long long
#define cint const int
#define ii pair<int, int>
#define fi first
#define se second
#define vi vector<int>
#define vii vector<vi>
#define pb push_back
#define pq priority_queue
#define mid(l, r) ((l + r) >> 1)
#define left(id) (id << 1)
#define cntbit(mask) __builtin_popcountll(mask)
#define BIT(mask, i) (mask & (1ll << (i)))
#define ONBIT(mask, i) (mask | (1ll << (i)))
const int MAXN = 1e5 + 15;
const int oo = 1e18;
const int MOD = 1e9 + 7;
struct Edge {
int u, v, w;
} B[MAXN];
struct cmp {
bool operator() (Edge a, Edge b) {
return a.w < b.w;
}
};
int N, M, Q;
int T[MAXN], C[MAXN];
struct query {
int l, r, k;
} qr[MAXN];
struct Dosu {
int par[MAXN];
set<int> sz[MAXN];
void INIT() {
for (int i = 1; i <= N; i++) {
sz[i].insert(T[i]);
par[i] = i;
}
}
int find_set(int u) {
if (par[u] == u) return u;
return par[u] = find_set(par[u]);
}
void union_set(int u, int v) {
u = find_set(u), v = find_set(v);
if (u == v) return;
if (sz[u].size() < sz[v].size()) swap(u, v);
par[v] = u;
for (auto E : sz[v]) sz[u].insert(E);
}
} DSU;
struct Bachcho {
int L[MAXN], R[MAXN], MID[MAXN];
vector<int> q[MAXN];
void INIT() {
for (int i = 1; i <= Q; i++) {
L[i] = 0, R[i] = M + 1, MID[i] = (L[i] + R[i]) / 2;
q[MID[i]].pb(i);
}
}
bool check(int id) {
if (DSU.find_set(qr[id].l) != DSU.find_set(qr[id].r)) return false;
if (DSU.sz[DSU.find_set(qr[id].l)].size() >= qr[id].k) return true;
return false;
}
void SOLVE() {
while(1) {
DSU.INIT();
for (int i = 1; i <= M; i++) {
DSU.union_set(B[i].u, B[i].v);
for (auto id : q[i]) {
if (check(id)) R[id] = MID[id];
else L[id] = MID[id];
if (R[id] > L[id] + 1) MID[id] = (R[id] + L[id]) / 2;
}
}
for (int i = 1; i <= M; i++) q[i].clear();
bool kt = 0;
for (int i = 1; i <= Q; i++) {
if (R[i] <= L[i] + 1) continue;
kt = 1;
q[MID[i]].pb(i);
}
if (!kt) break;
}
}
} PBS;
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
// freopen("a.inp", "r", stdin);
// freopen("a.out", "w", stdout);
cin >> N >> M >> Q;
for (int i = 1; i <= N; i++) {
cin >> T[i];
}
for (int i = 1; i <= M; i++) {
int u, v, w;
cin >> u >> v >> w;
B[i] = {u, v, w};
}
sort (B + 1, B + M + 1, cmp());
for (int i = 1; i <= M; i++) C[i] = B[i].w;
;
for (int i = 1; i <= Q; i++) {
cin >> qr[i].l >> qr[i].r >> qr[i].k;
}
PBS.INIT();
PBS.SOLVE();
for (int i = 1; i <= Q; i++) {
if (PBS.R[i] > M) cout << " -1\n";
else cout << C[PBS.R[i]] << '\n';
}
}