#include<bits/stdc++.h>
using namespace std;
struct node{
int to,w;
};
struct point {
int d;long long dis;
bool operator<(const point b)const {
return dis>b.dis;
}
};
int n,m,b,r,s,l,p,q,dis[50005];
vector <node> g[50005];
void pri_dij(int ss)
{
priority_queue <point> q;
memset(dis,0x3f,sizeof(dis));
q.push((point){ss,0});
bool vis[50005];
dis[ss]=0;
while(!q.empty())
{
point o=q.top();q.pop();
int u=o.d;
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i].to,ww=g[u][i].w;
if(!vis[v]&&dis[v]>dis[u]+ww)
{
dis[v]=dis[u]+ww;
q.push((point){v,dis[v]});
}
}
}
}
int main()
{
cin>>n>>m>>b;
for(int i=1;i<=m;i++)
{
cin>>r>>s>>l;
g[r].push_back((node){s,l});
g[s].push_back((node){r,l});
}
pri_dij(1);
for(int i=1;i<=b;i++)
{
cin>>p>>q;
cout<<dis[p]+dis[q]<<endl;
}
return 0;
}