//2023/5/4
//别着急,先通读一遍题目
//别忘了开long long
//写完先看一遍怎么降复杂度
//要么开全局变量要么给定初值
//想想看,有什么情况需要特判
//std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+10;
const int INF=0x3f3f3f3f;
int num,ans;
int n,m,s,t;
int read()
{
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-'){w=-1;}ch=getchar();}
while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}
return s*w;
}
struct node{
int id;
int dist;
node()
{
id=0;dist=0;
}
node(int c,int d)
{
id=c;dist=d;
}
bool operator < (const node &x)const
{
return x.dist<dist;
}
};
priority_queue<node> que;
struct linkstar{
int to,from;
int w;
int next;
}edge[330000];
int head[330000];
int dis[330000];
int vis[330000];
int escnt;
void add(int from,int to,int w)
{
edge[++escnt].from=from;
edge[escnt].to=to;
edge[escnt].w=w;
edge[escnt].next=head[from];
head[from]=escnt;
}
void Dijkstra(int u)
{
for (int i=1;i<=n;i++)
{
dis[i]=INF;
}
memset(vis,0,sizeof(vis));
dis[u]=0;
que.push(node(u,0));
int cnt=0;
while(que.size())
{
node cp=que.top();
que.pop();
if(vis[cp.id]) continue;
cnt++;
vis[cp.id]=true;
for (int i=head[cp.id];i!=-1;i=edge[i].next)
{
if(dis[edge[i].to]>max(dis[cp.id],edge[i].w))
{
dis[edge[i].to]=max(dis[cp.id],edge[i].w);
if(!vis[edge[i].to])
{
que.push(node(edge[i].to,dis[edge[i].to]));
}
}
}
}
}
int main()
{
memset(head,-1,sizeof(head));
n=read();
m=read();
t=read();
for (int i=1;i<=m;i++)
{
int x,y,w;
x=read();
y=read();
w=read();
add(x,y,w);
}
for (int i=1;i<=t;i++)
{
int as,az;
as=read();
az=read();
Dijkstra(as);
dis[az]==INF? cout<<"-1"<<endl : cout<<dis[az]<<endl;
}
return 0;
}