#include <iostream>
#include <cstring>
#include <queue>
#define M 100001
#define N 50001
#define maxn 0x3f3f3f
using namespace std;
int n,m,b,head[N],dis[N],cnt=0;
bool vis[N];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q;
struct node{
int to,next,w;
}edge[M];
void add(int u,int v,int w){
edge[cnt].w=w;
edge[cnt].to=v;
edge[cnt].next=head[u];
head[u]=cnt++;
return ;
}
void dijkstra(){
q.push(make_pair(0,1));
dis[1]=0;
while(!q.empty()){
int now=q.top().second;
q.pop();
if(vis[now]) continue;
vis[now]=1;
for(int i=head[now];i!=-1;i=edge[i].next){
if(dis[edge[i].to]>dis[now]+edge[i].w){
dis[edge[i].to]=dis[now]+edge[i].w;
q.push(make_pair(dis[edge[i].to],edge[i].to));
}
}
}return ;
}
int main(){
memset(dis,maxn,sizeof dis);
memset(head,-1,sizeof head);
int u,v,w;
cin>>n>>m>>b;
while(m--) cin>>u>>v>>w,add(u,v,w),add(v,u,w);
dijkstra();
while(b--){
cin>>u>>v;
cout<<dis[u]+dis[v]<<endl;
}return 0;
}