rt,全WA
#include <bits/stdc++.h>
#define int long long
using namespace std;
static const int N=5e6+1e5;
int n,m,Q;
struct Graph{
struct Edge{
int to,vl,Nxt;
}e[N];
int tot=1;
int Sign[N];
inline void add(int fr,int to,int vl){
tot++;
e[tot].vl=vl;
e[tot].to=to;
e[tot].Nxt=Sign[fr];
Sign[fr]=tot;
}
}G1,G2;
int Dfn[N],Low[N],tim;
int Fro[N],Dis[N],Dep[N],PreDis[N],CirDis[N],PCnt;
inline void Build(int fr,int to,int vl){
PCnt++;
int sum=vl;
for(int P=to;P!=Fro[fr];P=Fro[P]){
CirDis[P]=sum;
sum+=PreDis[P];
}
CirDis[PCnt+n]=CirDis[fr];
CirDis[fr]=0;
for(int P=to;P!=Fro[fr];P=Fro[P]){
int prsm=min(CirDis[P],CirDis[PCnt+n]-CirDis[P]);
G2.add(PCnt+n,P,prsm);
G2.add(P,PCnt+n,prsm);
}
}
inline void Tarjan(int rt,int fr){
Dfn[rt]=Low[rt]=++tim;
for(int i=G1.Sign[rt];i;i=G1.e[i].Nxt){
int to=G1.e[i].to;
int vl=G1.e[i].vl;
if(!Dfn[to]){
Fro[to]=rt;
PreDis[to]=vl;
Tarjan(to,rt);
Low[rt]=min(Low[rt],Low[to]);
}
else if(to!=fr){
Low[rt]=min(Low[rt],Dfn[to]);
}
if(Low[to]>Dfn[rt]){
G2.add(rt,to,vl);
G2.add(to,rt,vl);
}
}
for(int i=G1.Sign[rt];i;i=G1.e[i].Nxt){
int to=G1.e[i].to;
int vl=G1.e[i].vl;
if(Fro[to]==rt or Dfn[to]<=Dfn[rt])
continue;
Build(rt,to,vl);
}
}
int Siz[N],Top[N],Chi[N];
inline void Run(int rt,int fr){
Fro[rt]=fr;
Siz[rt]=1;
for(int i=G2.Sign[rt];i;i=G2.e[i].Nxt){
int to=G2.e[i].to;
int vl=G2.e[i].vl;
if(to==fr)
continue;
Dep[to]=Dep[rt]+1;
Dis[to]=Dis[rt]+vl;
Run(to,rt);
Siz[rt]+=Siz[to];
if(Siz[to]>Siz[Chi[rt]] or !Chi[rt])
Chi[rt]=to;
}
}
inline void Cutting(int rt,int tp){
Top[rt]=tp;
if(!Chi[rt])
return;
Cutting(Chi[rt],tp);
for(int i=G2.Sign[rt];i;i=G2.e[i].Nxt){
int to=G2.e[i].to;
if(to!=Chi[rt] and to!=Fro[rt])
Cutting(to,to);
}
}
inline int LCA(int x,int y){
while(Top[x]!=Top[y]){
if(Dep[Top[x]]<Dep[Top[y]])
swap(x,y);
x=Fro[Top[x]];
}
return Dep[x]>Dep[y]?y:x;
}
inline int GetSon(int rt,int P){
int res;
while(Top[rt]!=Top[P]){
res=Top[rt];
rt=Fro[Top[rt]];
}
return rt==P?res:Chi[rt];
}
signed main(){
std::cin.tie(nullptr)->sync_with_stdio(false);
std::cout.tie(nullptr)->sync_with_stdio(false);
cin>>n>>m>>Q;
for(int i=1;i<=m;i++){
int x,y,z;
cin>>x>>y>>z;
G1.add(x,y,z);
G1.add(y,x,z);
}
Tarjan(1,0);
Run(1,0);
Cutting(1,1);
for(int i=1;i<=Q;i++){
int x,y;
cin>>x>>y;
int P=LCA(x,y);
if(P<=n)
cout<<Dis[x]+Dis[y]-2*Dis[P];
else{
int X=GetSon(x,P);
int Y=GetSon(y,P);
int Len=abs(CirDis[X]-CirDis[Y]);
cout<<min(Len,CirDis[P]-Len)+Dis[x]-Dis[X]+Dis[y]-Dis[Y];
}
cout<<'\n';
}
return 0;
}