#include<iostream>
#include<vector>
#include<queue>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define int long long
using namespace std;
const int MAXN = 1e6 + 5;
typedef struct Edge{
int u,v,w;
}Edge;
bool cmp(Edge x,Edge y){
return x.w < y.w;
}
Edge ed[MAXN];
vector<int> edge[MAXN];
int n,m,q,cnt = 0,node;
int a[MAXN],val[MAXN],f[MAXN],dfn[MAXN];
int sz[MAXN],rdfn[MAXN],fa[MAXN][30];
int find(int x){
return x == f[x] ? x : f[x] = find(f[x]);
}
void ex_kurskal(){
sort(ed + 1,ed + 1 + cnt,cmp);
for(int i = 1; i <= cnt; i++){
int u = ed[i].u,v = ed[i].v,w = ed[i].w;
if(find(u) != find(v)){
node++;
u = find(u),v = find(v);
f[u] = f[v] = node;
fa[u][0] = fa[v][0] = node;
val[node] = w;
edge[node].push_back(u);
edge[node].push_back(v);
}
}
}
int tim = 0,vis[MAXN],lf[MAXN];
void dfs(int u,int fat){
dfn[u] = ++tim;
rdfn[tim] = u;
vis[u] = 1;
sz[u] = 1;
for(int i = 20; i >= 1; i--){
fa[u][i] = fa[fa[u][i - 1]][i - 1];
}
for(int i = 0; i < edge[u].size(); i++){
int v = edge[u][i];
if(v == fat){
continue;
}
dfs(v,u);
sz[u] += sz[v];
lf[u] += lf[v];
}
}
typedef struct TR{
int ls,rs,sum;
}TR;
TR tr[MAXN * (1 << 5)];
int cnt_node = 0,rt[MAXN];
void insert(int &pos,int pre,int l,int r,int p,int flag){
pos = ++cnt_node;
tr[pos] = tr[pre];
if(flag){
tr[pos].sum++;
}
if(l == r){
return;
}
int mid = (l + r) >> 1;
if(p <= mid){
insert(tr[pos].ls,tr[pre].ls,l,mid,p,flag);
}
else{
insert(tr[pos].rs,tr[pre].rs,mid + 1,r,p,flag);
}
}
int b[MAXN];
int query(int pos,int pre,int l,int r,int k){
int x = tr[tr[pos].rs].sum - tr[tr[pre].rs].sum;
if(l == r){
return b[l];
}
int mid = (l + r) >> 1;
if(k > x){
return query(tr[pos].ls,tr[pre].ls,l,mid,k - x);
}
else{
return query(tr[pos].rs,tr[pre].rs,mid + 1,r,k);
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m >> q;
node = n;
for(int i = 1; i <= 2 * n; i++){
f[i] = i;
}
for(int i = 1; i <= n; i++){
cin >> a[i];
b[i] = a[i];
}
sort(b + 1,b + 1 + n);
int n2 = unique(b + 1,b + 1 + n) - b - 1;
for(int i = 1; i <= m; i++){
int u,v,w;
cin >> u >> v >> w;
ed[++cnt].u = u;
ed[cnt].v = v;
ed[cnt].w = w;
}
ex_kurskal();
for(int i = 1; i <= n; i++){
lf[i] = 1;
}
for(int i = node; i >= 1; i--){
if(!vis[i]){
dfs(i,0);
}
}
for(int i = 1; i <= tim; i++){
int pos = lower_bound(b + 1,b + 1 + n2,a[rdfn[i]]) - b;
if(rdfn[i] > n){
rt[i] = rt[i - 1];
}
else{
insert(rt[i],rt[i - 1],1,n2,pos,1);
}
}
int lastans = 0;
while(q--){
int u,x,k;
cin >> u >> x >> k;
u = (u ^ lastans) % n + 1;
k = (k ^ lastans) % n + 1;
x = (x ^ lastans);
int temp = u;
for(int i = 20; i >= 0; i--){
if(fa[temp][i] && val[fa[temp][i]] <= x){
temp = fa[temp][i];
}
}
if(lf[temp] < k){
cout << -1 << endl;
lastans = 0;
continue;
}
lastans = query(rt[dfn[temp] + sz[temp] - 1],rt[dfn[temp] - 1],1,n2,k);
cout << lastans << endl;
}
}