#include <bits/stdc++.h>
using namespace std;
/*
* A21358 鍩庡競寤鸿 (HNOI2010 / BZOJ2001 / 娲涜胺P3206) 鈥斺€?鍔ㄦ€佹渶灏忕敓鎴愭爲
* 瑙f硶锛氬璇㈤棶鏃堕棿杞村仛鍒嗘不(CDQ/绾挎鏍戝垎娌?锛屾瘡涓妭鐐瑰仛涓ゆ瑙勬ā缂╁噺锛?
* Reduction(缂╄竟)锛氫粎鐢ㄥ浐瀹氳竟(鏈尯闂村唴鏉冨€间笉鍙樼殑杈?璺?Kruskal锛岃惤閫夊浐瀹氳竟
*
* Contraction(缂╃偣)锛氭妸鍔ㄦ€佽竟瑙嗕綔 -inf 鎺掑簭鍚庝笌鍥哄畾杈逛竴璧疯窇 Kruskal锛?
*
* 缂╃偣鍚庡姩鎬佽竟涓庡墿浣欏浐瀹氳竟浼犵粰瀛愬尯闂达紝瑙勬ā闄嶄负 O(鍖洪棿闀?锛?
* 鐢ㄥ彲鎾ら攢骞舵煡闆?鎸夊ぇ灏忓悎骞躲€佹棤璺緞鍘嬬缉)鏀寔鍥炴函銆?
* 鏉冨€奸噰鐢ㄥ叏灞€鏁扮粍 + 鍙跺瓙澶勨€滀慨鏀逛负 d鈥濈殑璇箟锛屾寜鏃堕棿椤哄簭璁块棶鍙跺瓙锛?
* 宸﹀崐鍖虹殑淇敼鑷姩瀵瑰彸鍗婂尯鐢熸晥锛屾棤闇€鏄惧紡浼犻€掓潈鍊兼洿鏂般€?
* 澶嶆潅搴︼細O((m + q log q) log n) 绾у埆銆?
*/
struct Edge { int u, v, id; };
int n, m, q;
int U[50005], V[50005], W[50005]; // 鍏ㄥ眬绔偣/鏉冨€硷紙W 闅忓彾瀛愭帹杩涜淇敼锛?
int K[50005], D[50005]; // 绗?t 鏉¤闂細杈?K[t] 浠d环鏀逛负 D[t]
int inDyn[50005], curStamp;
// ---- 鍙挙閿€骞舵煡闆?----
vector<int> fa, sz;
struct Rec { int c, p, sp; };
vector<Rec> stk;
inline int findx(int x) { while (fa[x] != x) x = fa[x]; return x; }
inline bool unite(int a, int b) {
a = findx(a); b = findx(b);
if (a == b) return false;
if (sz[a] < sz[b]) swap(a, b);
stk.push_back({b, a, sz[a]});
fa[b] = a; sz[a] += sz[b];
return true;
}
inline void rollback(size_t snap) {
while (stk.size() > snap) {
Rec s = stk.back(); stk.pop_back();
fa[s.c] = s.c; sz[s.p] = s.sp;
}
}
long long curAns, res[50005];
void solve(int l, int r, vector<Edge> E) {
if (l == r) {
// 搴旂敤姘镐箙淇敼锛氳竟 K[l] 鏉冨€煎彉涓?D[l]
W[K[l]] = D[l];
size_t snap = stk.size();
long long ansIn = curAns;
sort(E.begin(), E.end(), [](const Edge &a, const Edge &b) { return W[a.id] < W[b.id]; });
for (const Edge &e : E)
if (unite(e.u, e.v)) curAns += W[e.id];
res[l] = curAns;
rollback(snap);
curAns = ansIn;
return;
}
int mid = (l + r) >> 1;
long long ansIn = curAns;
}
int main() {
if (scanf("%d%d%d", &n, &m, &q) != 3) return 0;
for (int i = 1; i <= m; ++i) scanf("%d%d%d", &U[i], &V[i], &W[i]);
for (int t = 1; t <= q; ++t) scanf("%d%d", &K[t], &D[t]);
}