#include<bits/stdc++.h>
using namespace std;
const long long N = 1000010;
const long long inf = 0x3f3f3f3f;
long long n,m,b;
long long x,y,z;
long long head[N*2],tot,vis[N],dis[N];
struct Edge{
long long to,nxt,w;
}e[N*2];
void add(long long u,long long v,long long w){
e[++tot].to=v;
e[tot].nxt=head[u];
e[tot].w=w;
head[u]=tot;
}
struct Node{
long long dis;
long long idx;
bool operator < (const Node &tmp) const {
tmp.dis < dis;
}
};
priority_queue <Node> q;
void d(){
dis[1]=0;
q.push({0,1});
vis[1]=1;
while(!q.empty()){
Node tmp=q.top();q.pop();
long long u=tmp.idx;
vis[u]=0;
for(long long i=head[u];i;i=e[i].nxt){
long long v=e[i].to;
if(dis[u]+e[i].w<dis[v]){
dis[v]=dis[u]+e[i].w;
if(!vis[v]){
vis[v]=1;
q.push({dis[v],v});
}
}
}
}
}
int main(){
scanf("%lld%lld%lld",&n,&m,&b);
for(long long i=1;i<=n;++i) dis[i]=inf;
for(long long i=1;i<=m;++i){
scanf("%lld%lld%lld",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
d();
while(b--){
scanf("%lld%lld",&x,&y);
cout<<dis[x]+dis[y]<<endl;
}
return 0;
}