#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+5;
ll last;
int n, m, q, a[N], c[N], nn;
int hea[N], tot, f[N][25];
int fa[N], cnt, val[N];
int rt[N];
int dfn[N], L[N], R[N], dfs_clock;
struct Line { int s, t, w; }e[N];
struct Edge { int v, nt; }ed[N];
struct SegmentTree {
int tot;
struct Tree {
int cnt, ls, rs;
}tr[N<<5];
int Build(int l,int r) {
int p=++tot;
if(l==r) return p;
int mid=(l+r)>>1;
tr[p].cnt=0;
tr[p].ls=Build(l, mid);
tr[p].rs=Build(mid+1, r);
return p;
}
int Add(int o, int l, int r, int k) {
if(!k) return o;
int p=++tot;
tr[p]=tr[o]; tr[p].cnt++;
if(l==r) return p;
int mid=(l+r)>>1;
if(k<=mid) tr[p].ls=Add(tr[p].ls, l, mid, k);
else tr[p].rs=Add(tr[p].rs, mid+1, r, k);
return p;
}
int Ask(int o1, int o2, int l, int r, int k) {
if(!k) return 0;
if(tr[o2].cnt-tr[o1].cnt<k) return 0;
int mid=(l+r)>>1, x=tr[tr[o2].rs].cnt-tr[tr[o1].rs].cnt;
if(l==r) return l;
if(x<k) return Ask(tr[o1].ls, tr[o2].ls, l, mid, k-x);
return Ask(tr[o1].rs, tr[o2].rs, mid+1, r, k);
}
}dis;
inline ll read() {
ll x=0,fl=1; register char ch=getchar();
for( ; !isdigit(ch); fl=ch=='-'?-1:1, ch=getchar());
for( ; isdigit(ch); x=(x<<3)+(x<<1)+(ch^48), ch=getchar());
return fl==1?x:-x;
}
void dfs(int u, int fat) {
f[u][0]=fat;
L[u]=++dfs_clock; dfn[dfs_clock]=u;
for(int i=1; i<=25; ++i) f[u][i]=f[f[u][i-1]][i-1];
for(int i=hea[u]; i; i=ed[i].nt) {
int v=ed[i].v;
if(v==fat) continue;
dfs(v, u);
}
R[u]=dfs_clock;
}
int get(int x) { return fa[x]==x?x:fa[x]=get(fa[x]); }
void add(int u, int v) { ed[++tot]={v, hea[u]}; hea[u]=tot; }
void kruskal() {
iota(fa+1, fa+2*n+1, 1); cnt=n;
sort(e+1, e+m+1, [=](const Line &x, const Line &y){ return x.w<y.w; });
for(int i=1, fx=0, fy=0; i<=m; ++i) {
fx=get(e[i].s), fy=get(e[i].t);
if(fx==fy) continue;
val[++cnt]=e[i].w;
fa[fx]=fa[fy]=cnt;
add(cnt, fx), add(cnt, fy);
}
}
int main() {
n=read();
m=read();
q=read();
for(int i=1; i<=n; ++i) a[i]=read(), c[++nn]=a[i];
for(int i=1; i<=m; ++i)
e[i].s=read(), e[i].t=read(), e[i].w=read();
sort(c+1, c+nn+1);
nn=unique(c+1, c+nn+1)-c-1;
kruskal();
for(int i=1; i<=cnt; ++i) if(fa[i]==i) dfs(i, 0);
for(int i=1; i<=n; ++i) a[i]=lower_bound(c+1, c+nn+1, a[i])-c;
rt[0]=dis.Build(1, nn);
for(int i=1; i<=cnt; ++i) rt[i]=dis.Add(rt[i-1], 1, nn, a[dfn[i]]);
val[0]=1e9;
while(q--) {
ll u=(read()^last)%n+1, x=read()^last, k=(read()^last)%n+1;
for(int i=25; ~i; --i) if(f[u][i] && val[f[u][i]]<=x) u=f[u][i];
last=c[dis.Ask(rt[L[u]-1], rt[R[u]], 1, nn, k)];
if(!last) puts("-1");
else printf("%lld\n", last);
}
return 0;
}