#pragma GCC optimize("O3,inline")
#include <bits/stdc++.h>
using namespace std;
#define int long long
int cnt = 0, cnt1 = 0, ans1 = 0, sqrtN, crntv = 0;
vector<vector<int>> adjlist, p2;
vector<int> p, idx, redness, pre, post, d, ipre;
int fin(int n) {
if (p[n] == n) return n;
return p[n] = fin(p[n]);
}
void join(int a, int b, int x) {
a = fin(a);
b = fin(b);
if (a == b) return;
p[b] = a;
adjlist[cnt].push_back(idx[a]);
adjlist[cnt].push_back(idx[b]);
idx[a] = p2[0][idx[a]] = p2[0][idx[b]] = cnt++;
redness[idx[a]] = x;
ans1 += x;
}
void dfs(int n) {
pre[n] = cnt1++;
ipre.push_back(n);
for (int i : adjlist[n]) {
d[i] = d[n] + 1;
dfs(i);
}
post[n] = cnt1 - 1;
}
bool comp(pair<pair<int, int>, int> a, pair<pair<int, int>, int> b) {
if (a.first.first / sqrtN == b.first.first / sqrtN) return a.first.second < b.first.second;
return a.first.first / sqrtN < b.first.first / sqrtN;
}
int lca(int a, int b) {
if (d[a] < d[b]) swap(a, b);
for (int i = 0; i < 18; i++) if ((d[a] - d[b]) & (1LL << i)) a = p2[i][a];
if (a == b) return a;
for (int i = 17; i >= 0; i--) if (p2[i][a] != p2[i][b]) a = p2[i][a], b = p2[i][b];
return p2[0][a];
}
set<int> ss;
void handle(int n, int k) {
auto iter = ss.lower_bound(pre[n]);
int crntd = -1, crntn = -1;
if (iter != ss.end()) crntn = lca(ipre[*iter], n), crntd = d[crntn];
if (iter != ss.begin()) {
iter--;
int clca = lca(ipre[*iter], n);
if (crntd < d[clca]) crntd = d[clca], crntn = clca;
}
if (crntn != -1) crntv += k * redness[crntn];
}
signed main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int N, M, Q, a, b, c; cin >> N >> M >> Q;
sqrtN = pow(N, 0.5);
adjlist.resize(2 * N + 5, vector<int>());
p2.resize(18, vector<int>(2 * N + 5, -1));
redness.resize(2 * N + 5, 0);
pre.resize(2 * N + 5, 0);
post.resize(2 * N + 5, 0);
d.resize(2 * N + 5, 0);
for (int i = 0; i < N; i++) {
p.push_back(i);
idx.push_back(i);
}
cnt = N;
vector<pair<int, pair<int, int>>> edges;
for (int i = 0; i < M; i++) {
cin >> a >> b >> c;
edges.push_back({ c, {a, b} });
}
sort(edges.begin(), edges.end());
for (int i = 0; i < M; i++) join(edges[i].second.first, edges[i].second.second, edges[i].first);
dfs(cnt - 1);
for (int i = 1; i < 18; i++) {
for (int j = 0; j < cnt; j++) {
if (p2[i - 1][j] == -1) p2[i][j] = -1;
else p2[i][j] = p2[i - 1][p2[i - 1][j]];
}
}
vector<pair<pair<int, int>, int>> quers;
vector<int> anss(Q, 0);
for (int i = 0; i < Q; i++) {
cin >> a >> b;
quers.push_back({ {a, b}, i });
}
sort(quers.begin(), quers.end(), comp);
pair<int, int> crntr = { 0, 0 };
for (int i = 0; i < Q; i++) {
while (crntr.second <= quers[i].first.second) {
handle(crntr.second, 1);
ss.insert(pre[crntr.second]);
crntr.second++;
}
while (crntr.first > quers[i].first.first) {
crntr.first--;
handle(crntr.first, 1);
ss.insert(pre[crntr.first]);
}
while (crntr.second > quers[i].first.second + 1) {
crntr.second--;
ss.erase(pre[crntr.second]);
handle(crntr.second, -1);
}
while (crntr.first < quers[i].first.first) {
ss.erase(pre[crntr.first]);
handle(crntr.first, -1);
crntr.first++;
}
anss[quers[i].second] = crntv;
}
for (int i : anss) cout << ans1 - i << '\n';
}