#include<bits/stdc++.h>
using namespace std;
#define lson t[p].l,l,mid
#define rson t[p].r,mid+1,r
#define lc ch[p][0]
#define rc ch[p][1]
inline int ls(int p){return p<<1;}
inline int rs(int p){return p<<1|1;}
const int maxn=4e5+5;
const int maxm=5e5+5;
int n,m,Q,a[maxn],h[maxn],o[maxn];
struct EDGE{
int u,v,w;
}E[maxm];
inline bool cmp(EDGE u,EDGE v){
return u.w<v.w;
}
struct edge{
int v,next;
}e[maxn<<1];int head[maxn],cnt;
inline void add(int u,int v){
e[++cnt]=(edge){v,head[u]};
head[u]=cnt;
}
int fa[maxn],val[maxn],L[maxn],R[maxn];
int d[maxn][30];
inline void init(){
for(int i=1;i<=n;++i){
fa[i]=i;
}
}
inline int find(int x){
return fa[x]==x?x:fa[x]=find(fa[x]);
}
int res,id[maxn];
inline void dfs(int u,int f){
L[u]=1e9;
if(u<=n){
L[u]=R[u]=++res;
id[res]=u;
return;
}
for(int i=head[u];i;i=e[i].next){
int v=e[i].v;
if(v==f) continue;
dfs(v,u);
d[v][0]=u;
L[u]=min(L[u],L[v]);
R[u]=max(R[u],R[v]);
}
}
inline void Kruskal(){
init();sort(E+1,E+1+m,cmp);
int tot=n;
for(int i=1;i<=m;++i){
int u=E[i].u,v=E[i].v,w=E[i].w;
int p=find(u),q=find(v);
if(p!=q){
++tot;
add(tot,p);add(p,tot);
add(tot,q);add(q,tot);
fa[p]=fa[q]=fa[tot]=tot;
val[tot]=w;
}
}
dfs(tot,0);
for(int i=1;i<=n;++i){
h[i]=a[id[i]];
}
for(int j=1;(1<<j)<=tot;++j){
for(int i=1;i<=n;++i){
d[i][j]=d[d[i][j-1]][j-1];
}
}
}
struct SegmentTree{
int l,r,sum;
}t[maxn*20];int rt[maxn],Cnt;
inline void build(int &p,int l,int r){
p=++Cnt;
if(l==r){
t[p].sum=0;
return;
}
int mid=(l+r)>>1;
build(lson);build(rson);
}
inline void Modify(int &q,int p,int l,int r,int x){
q=++Cnt;t[q]=t[p];++t[q].sum;
if(l==r) return;
int mid=(l+r)>>1;
if(x<=mid) Modify(t[q].l,lson,x);
if(x>mid) Modify(t[q].r,rson,x);
}
inline int Query(int l,int r,int lx,int rx,int k){
int x=t[t[rx].l].sum-t[t[lx].l].sum;
if(l==r) return o[l];
int mid=(l+r)>>1;
if(x>=k) return Query(l,mid,t[lx].l,t[rx].l,k);
else return Query(mid+1,r,t[lx].r,t[rx].r,k-x);
}
inline void solve(){
scanf("%d%d%d",&n,&m,&Q);
for(int i=1;i<=n;++i){
scanf("%d",&a[i]);
}
for(int i=1,u,v,w;i<=m;++i){
scanf("%d%d%d",&u,&v,&w);
E[i]=(EDGE){u,v,w};
}
Kruskal();
for(int i=1;i<=n;++i){
o[i]=h[i];
}
sort(o+1,o+1+n);
int l=unique(o+1,o+1+n)-o-1;
build(rt[0],1,l);
for(int i=1;i<=n;++i){
int x=lower_bound(o+1,o+1+l,h[i])-o;
Modify(rt[i],rt[i-1],1,l,x);
}
val[0]=2e9;
for(int u,x,k;Q;--Q){
scanf("%d%d%d",&u,&x,&k);
for(int i=25;i>=0;--i){
if(val[d[u][i]]<=x){
u=d[u][i];
}
}
if(R[u]-L[u]+1<k){
printf("-1\n");
continue;
}
vector<int>r;
for(int i=L[u];i<=R[u];++i){
r.push_back(h[i]);
}
sort(r.begin(),r.end());
printf("%d\n",r[R[u]-L[u]+1-k]);
}
}
signed main(){
int T=1;
for(;T;--T){
solve();
}
return 0;
}