#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,q,l[200005],r[200005],fsf[30][200005],dep[200005];
int num[200005],f[200005],h[200005],minn[200005],maxx[200005],_id[200005],cnt=0;
inline void init(int u,int fa){
fsf[0][u]=fa;
dep[u]=dep[fa]+1;
for(register int i=1;i<=25;++i){
fsf[i][u]=fsf[i-1][fsf[i-1][u]];
}
minn[u]=LONG_LONG_MAX;
if(l[u]==0)minn[u]=++cnt,maxx[u]=cnt,_id[cnt]=u;
if(l[u]==0)return;
for(register int mmm=l[u],i=1;i<=2;mmm=r[u],++i){
int v=mmm;
if(v==fa)continue;
init(v,u);
minn[u]=min(minn[u],minn[v]);
maxx[u]=max(maxx[u],maxx[v]);
}
}
inline int LCA(int u,int k){
int i=0;
while(k){
if(k&1)u=fsf[i][u];
k>>=1,++i;
}
return u;
}
struct node{int u,v,w;bool operator<(const node&x)const{return w<x.w;}}e[500005];
int fun(const int&x){if(f[x]==x)return x;return f[x]=fun(f[x]);}
inline void kruskal(){
stable_sort(e+1,e+m+1);
for(register int i=1;i<=m;++i){
int fu=fun(e[i].u),fv=fun(e[i].v);
if(fu!=fv){
l[++n]=fu;
r[n]=fv;
num[n]=e[i].w;
f[fv]=n;
f[fu]=n;
f[n]=n;
}
}
}
namespace seq{
int tot=0,n=0;
int sum[200005<<5]={},rt[200005]={},ls[200005<<5]={},rs[200005<<5]={};
int a[200005]={},ind[200005]={},len=0;
inline int getid(const int&val){
return lower_bound(ind+1,ind+len+1,val)-ind;
}
inline int build(int l,int r){
int root=++tot;
if(l==r)return root;
int mid=(l+r)>>1;
ls[root]=build(l,mid);
rs[root]=build(mid+1,r);
return root;
}
inline int update(int k,int l,int r,int root){
int dir=++tot;
ls[dir]=ls[root],rs[dir]=rs[root],sum[dir]=sum[root]+1;
if(l==r)return dir;
int mid=(l+r)>>1;
if(k<=mid)
ls[dir]=update(k,l,mid,ls[dir]);
else
rs[dir]=update(k,mid+1,r,rs[dir]);
return dir;
}
inline int query(int u,int v,int l,int r,int k){
int mid=(l+r)>>1,
x=sum[ls[v]]-sum[ls[u]];
if(l==r)return l;
if(k<=x)
return query(ls[u],ls[v],l,mid,k);
else
return query(rs[u],rs[v],mid+1,r,k-x);
}
inline void init(){
n=(::n*2-1);
for(register int i=1;i<=n;++i){
a[i]=::h[_id[i]];
}
memcpy(ind,a,sizeof ind);
stable_sort(ind+1,ind+n+1);
len=n;
rt[0]=build(1,len);
for(register int i=1;i<=n;++i)rt[i]=update(getid(a[i]),1,len,rt[i-1]);
}
inline int work(int l,int r,int k){
if(k<0){
return -1;
}
return ind[query(rt[l-1],rt[r],1,len,k)];
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
iota(f+1,f+200002,1);
cin>>n>>m>>q;
for(register int i=1;i<=n;++i){
cin>>h[i];
}
for(register int j=1;j<=m;j++){
cin>>e[j].u>>e[j].v>>e[j].w;
}
kruskal();
::init(n,n);
seq::init();
int maxxx=0;
for(int i=1;i<=n;i++){
maxxx=max(maxxx,dep[i]);
}
while(q--){
int v,x,k;
cin>>v>>x>>k;
int L=0,R=maxxx,ans;
while(L<=R){
int mid=(L+R)>>1;
if(num[LCA(v,mid)]<=x){
ans=mid;
L=mid+1;
}else{
R=mid-1;
}
}
L=LCA(v,ans);
R=maxx[L];L=minn[L];
ans=seq::work(L,R,R-L+2-k);
cout<<ans<<"\n";
}
return 0;
}