#include<bits/stdc++.h>
using namespace std ;
typedef long long ll ;
#define F first
#define S second
#define g0 get<0>
#define g1 get<1>
#define g2 get<2>
const int N = 1e5+5 ;
const int M = 1e5+5 ;
const int Q = 2e5+5 ;
int n , m , q , par[N+M] , arr[N+M] , deep[N+M] , anc[N+M][(int)log2(N+M)+5] , cnt ;
vector<int> child[N+M] ;
vector<pair<int,int>> nei[N] ;
vector<tuple<int,int,int>> edge ;
ll cost ;
void dfs(int node){
for(int i:child[node]){
deep[i]=deep[node]+1 ;
anc[i][0]=node ;
dfs(i) ;
}
}
int flca(int a , int b){
if(deep[a]<deep[b]) swap(a,b) ;
int diff = deep[a]-deep[b] ;
for(int i=0 ; i<=log2(cnt)+1 ; i++){
if((diff>>i)&1) a=anc[a][i] ;
}
if(a==b) return a ;
for(int j=log2(cnt)+1 ; j>=0 ; j--){
if(anc[a][j]!=anc[b][j]) a=anc[a][j] , b=anc[b][j] ;
}
return anc[a][0] ;
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0) ;
cin >> n >> m >> q ;
for(int i=0 ; i<m ; i++){
int a , b , c ; cin >> a >> b >> c ;
nei[a].push_back({b,c}) ; nei[b].push_back({a,c}) ;
edge.push_back({c,a,b}) ;
}
sort(edge.begin(),edge.end()) ;
auto p = [&] (int k , auto &self) -> int {
if(par[k]<0) return k ;
else return par[k] = self(par[k],self) ;
};
memset(par,-1,sizeof(par)) ;
cnt = n-1 ;
for(int i=0 ; i<m ; i++){
int u = g1(edge[i]) , v = g2(edge[i]) , pu = p(u,p) , pv = p(v,p) ;
if(pu==pv) continue ;
cnt++ ;
child[cnt].push_back(pu) , child[cnt].push_back(pv) ;
arr[cnt]=g0(edge[i]) ; cost+=arr[cnt] ;
par[pu]=par[pv]=cnt ;
}
anc[cnt][0]=-1 ;
dfs(cnt) ;
for(int j=1 ; j<=log2(cnt)+1 ; j++){
for(int i=0 ; i<cnt ; i++) anc[i][j]=anc[anc[i][j-1]][j-1] ;
}
while(q--){
int le , ri ; cin >> le >> ri ;
int lca = flca(le,ri) ;
cout << cost-arr[lca] << '\n' ;
}
return 0 ;
}