#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define ll long long
#define bit(n, i) ((n >> i) & 1)
#define all(a) a.begin(), a.end()
#define rep(i, x, n) for (int i = x; i <= n; ++i)
#define red(i, x, n) for (int i = x; i >= n; --i)
#define inp(a) freopen(a".inp", "r", stdin), freopen(a".out", "w", stdout)
template<class A, class B> inline bool maxi(A &x, B y) {return (x < y ? x = y, 1 : 0);};
template<class A, class B> inline bool mini(A &x, B y) {return (x > y ? x = y, 1 : 0);};
const int N = 1e5 + 5;
const ll MOD = 1e9 + 7;
const ll INF = 1e11 + 642009;
// main program
struct DSU {
int n;
vector<int> lab;
void init(int _n){
n = _n;
lab.assign(n + 1, -1);
}
int get(int u){
return lab[u] < 0 ? u : lab[u] = get(lab[u]);
}
bool unite(int u, int v){
u = get(u); v = get(v);
if (u == v) return 0;
if (lab[u] > lab[v]) swap(u, v);
lab[u] += lab[v];
lab[v] = u;
return 1;
}
} dsu;
struct node {int v, w;};
struct edge {int u, v, w;};
struct element {
int u; ll d;
bool operator <(const element &other) const {
return d > other.d;
}
};
const int LOG = 17;
int n, m, t;
bool used[N];
vector<int> nodes;
vector<edge> edges;
vector<node> a[N], b[N];
int h[N], p[LOG + 1][N];
ll d[N], dist[100][N];
void dfs(int u){
for (auto [v, w]: b[u]){
if (v == p[0][u]) continue;
p[0][v] = u;
h[v] = h[u] + 1;
d[v] = d[u] + w;
rep(i, 1, LOG) p[i][v] = p[i - 1][p[i - 1][v]];
dfs(v);
}
}
int LCA(int u, int v){
if (h[v] > h[u]) swap(u, v);
int k = h[u] - h[v];
red(i, LOG, 0) if (bit(k, i)) u = p[i][u];
if (u == v) return v;
red(i, LOG, 0) if (p[i][u] != p[i][v]){
u = p[i][u]; v = p[i][v];
}
return p[0][u];
}
ll distLCA(int u, int v){
return d[u] + d[v] - 2 * d[LCA(u, v)];
}
void dijkstra(ll d[], int s){
priority_queue<element> q;
rep(i, 1, n) d[i] = INF;
d[s] = 0; q.push({s, 0});
while (q.size()){
auto [u, du] = q.top(); q.pop();
if (du != d[u]) continue;
for (auto [v, w]: a[u]){
if (d[v] > d[u] + w){
d[v] = d[u] + w;
q.push({v, d[v]});
}
}
}
}
ll query(int u, int v){
ll d1 = distLCA(u, v);
ll d2 = INF;
if (nodes.size() > 0){
rep(i, 0, (int)nodes.size() - 1) rep(j, i + 1, (int)nodes.size() - 1){
mini(d2, dist[i][u] + dist[i][nodes[j]] + dist[j][v]);
mini(d2, dist[j][u] + dist[i][nodes[j]] + dist[i][v]);
}
}
return min(d1, d2);
}
signed main(){
cin.tie(0) -> sync_with_stdio(0);
cin >>n >>m >>t;
rep(i, 1, m){
int u, v, w; cin >>u >>v >>w;
edges.pb({u, v, w});
a[u].pb({v, w}); a[v].pb({u, w});
}
sort(all(edges), [](const edge &a, const edge &b){
return a.w < b.w;
});
dsu.init(n);
for (auto [u, v, w]: edges){
if (dsu.unite(u, v)){
b[u].pb({v, w}); b[v].pb({u, w});
} else {
if (used[u] == 0) nodes.pb(u), used[u] = 1;
if (used[v] == 0) nodes.pb(v), used[v] = 1;
}
}
dfs(1);
rep(i, 0, (int)nodes.size() - 1) dijkstra(dist[i], nodes[i]);
while (t--){
int u, v; cin >>u >>v;
cout <<query(u, v) <<'\n';
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIGxsIGxvbmcgbG9uZwojZGVmaW5lIGJpdChuLCBpKSAoKG4gPj4gaSkgJiAxKQojZGVmaW5lIGFsbChhKSBhLmJlZ2luKCksIGEuZW5kKCkKI2RlZmluZSByZXAoaSwgeCwgbikgZm9yIChpbnQgaSA9IHg7IGkgPD0gbjsgKytpKQojZGVmaW5lIHJlZChpLCB4LCBuKSBmb3IgKGludCBpID0geDsgaSA+PSBuOyAtLWkpCiNkZWZpbmUgaW5wKGEpIGZyZW9wZW4oYSIuaW5wIiwgInIiLCBzdGRpbiksIGZyZW9wZW4oYSIub3V0IiwgInciLCBzdGRvdXQpCgp0ZW1wbGF0ZTxjbGFzcyBBLCBjbGFzcyBCPiBpbmxpbmUgYm9vbCBtYXhpKEEgJngsIEIgeSkge3JldHVybiAoeCA8IHkgPyB4ID0geSwgMSA6IDApO307CnRlbXBsYXRlPGNsYXNzIEEsIGNsYXNzIEI+IGlubGluZSBib29sIG1pbmkoQSAmeCwgQiB5KSB7cmV0dXJuICh4ID4geSA/IHggPSB5LCAxIDogMCk7fTsKCmNvbnN0IGludCBOID0gMWU1ICsgNTsKY29uc3QgbGwgTU9EID0gMWU5ICsgNzsKY29uc3QgbGwgSU5GID0gMWUxMSArIDY0MjAwOTsKCi8vIG1haW4gcHJvZ3JhbQoKc3RydWN0IERTVSB7CiAgICBpbnQgbjsKICAgIHZlY3RvcjxpbnQ+IGxhYjsKCiAgICB2b2lkIGluaXQoaW50IF9uKXsKICAgICAgICBuID0gX247CiAgICAgICAgbGFiLmFzc2lnbihuICsgMSwgLTEpOwogICAgfQoKICAgIGludCBnZXQoaW50IHUpewogICAgICAgIHJldHVybiBsYWJbdV0gPCAwID8gdSA6IGxhYlt1XSA9IGdldChsYWJbdV0pOwogICAgfQoKICAgIGJvb2wgdW5pdGUoaW50IHUsIGludCB2KXsKICAgICAgICB1ID0gZ2V0KHUpOyB2ID0gZ2V0KHYpOwoKICAgICAgICBpZiAodSA9PSB2KSByZXR1cm4gMDsKICAgICAgICBpZiAobGFiW3VdID4gbGFiW3ZdKSBzd2FwKHUsIHYpOwoKICAgICAgICBsYWJbdV0gKz0gbGFiW3ZdOwogICAgICAgIGxhYlt2XSA9IHU7CgogICAgICAgIHJldHVybiAxOwogICAgfQp9IGRzdTsKCnN0cnVjdCBub2RlIHtpbnQgdiwgdzt9OwpzdHJ1Y3QgZWRnZSB7aW50IHUsIHYsIHc7fTsKCnN0cnVjdCBlbGVtZW50IHsKICAgIGludCB1OyBsbCBkOwoKICAgIGJvb2wgb3BlcmF0b3IgPChjb25zdCBlbGVtZW50ICZvdGhlcikgY29uc3QgewogICAgICAgIHJldHVybiBkID4gb3RoZXIuZDsKICAgIH0KfTsKCmNvbnN0IGludCBMT0cgPSAxNzsKCmludCBuLCBtLCB0Owpib29sIHVzZWRbTl07CnZlY3RvcjxpbnQ+IG5vZGVzOwp2ZWN0b3I8ZWRnZT4gZWRnZXM7CnZlY3Rvcjxub2RlPiBhW05dLCBiW05dOwoKaW50IGhbTl0sIHBbTE9HICsgMV1bTl07CmxsIGRbTl0sIGRpc3RbMTAwXVtOXTsKCnZvaWQgZGZzKGludCB1KXsKICAgIGZvciAoYXV0byBbdiwgd106IGJbdV0pewogICAgICAgIGlmICh2ID09IHBbMF1bdV0pIGNvbnRpbnVlOwoKICAgICAgICBwWzBdW3ZdID0gdTsgCiAgICAgICAgaFt2XSA9IGhbdV0gKyAxOwogICAgICAgIGRbdl0gPSBkW3VdICsgdzsKCiAgICAgICAgcmVwKGksIDEsIExPRykgcFtpXVt2XSA9IHBbaSAtIDFdW3BbaSAtIDFdW3ZdXTsKCiAgICAgICAgZGZzKHYpOwogICAgfQp9CgppbnQgTENBKGludCB1LCBpbnQgdil7CiAgICBpZiAoaFt2XSA+IGhbdV0pIHN3YXAodSwgdik7CiAgICBpbnQgayA9IGhbdV0gLSBoW3ZdOwoKICAgIHJlZChpLCBMT0csIDApIGlmIChiaXQoaywgaSkpIHUgPSBwW2ldW3VdOwoKICAgIGlmICh1ID09IHYpIHJldHVybiB2OwoKICAgIHJlZChpLCBMT0csIDApIGlmIChwW2ldW3VdICE9IHBbaV1bdl0pewogICAgICAgIHUgPSBwW2ldW3VdOyB2ID0gcFtpXVt2XTsKICAgIH0KCiAgICByZXR1cm4gcFswXVt1XTsKfQoKbGwgZGlzdExDQShpbnQgdSwgaW50IHYpewogICAgcmV0dXJuIGRbdV0gKyBkW3ZdIC0gMiAqIGRbTENBKHUsIHYpXTsKCn0KCnZvaWQgZGlqa3N0cmEobGwgZFtdLCBpbnQgcyl7CiAgICBwcmlvcml0eV9xdWV1ZTxlbGVtZW50PiBxOwoKICAgIHJlcChpLCAxLCBuKSBkW2ldID0gSU5GOwogICAgZFtzXSA9IDA7IHEucHVzaCh7cywgMH0pOwoKICAgIHdoaWxlIChxLnNpemUoKSl7CiAgICAgICAgYXV0byBbdSwgZHVdID0gcS50b3AoKTsgcS5wb3AoKTsKCiAgICAgICAgaWYgKGR1ICE9IGRbdV0pIGNvbnRpbnVlOwoKICAgICAgICBmb3IgKGF1dG8gW3YsIHddOiBhW3VdKXsKICAgICAgICAgICAgaWYgKGRbdl0gPiBkW3VdICsgdyl7CiAgICAgICAgICAgICAgICBkW3ZdID0gZFt1XSArIHc7CgogICAgICAgICAgICAgICAgcS5wdXNoKHt2LCBkW3ZdfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCmxsIHF1ZXJ5KGludCB1LCBpbnQgdil7CiAgICBsbCBkMSA9IGRpc3RMQ0EodSwgdik7CiAgICBsbCBkMiA9IElORjsKCiAgICBpZiAobm9kZXMuc2l6ZSgpID4gMCl7CiAgICAgICAgcmVwKGksIDAsIChpbnQpbm9kZXMuc2l6ZSgpIC0gMSkgcmVwKGosIGkgKyAxLCAoaW50KW5vZGVzLnNpemUoKSAtIDEpewogICAgICAgICAgICBtaW5pKGQyLCBkaXN0W2ldW3VdICsgZGlzdFtpXVtub2Rlc1tqXV0gKyBkaXN0W2pdW3ZdKTsKICAgICAgICAgICAgbWluaShkMiwgZGlzdFtqXVt1XSArIGRpc3RbaV1bbm9kZXNbal1dICsgZGlzdFtpXVt2XSk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBtaW4oZDEsIGQyKTsKfQpzaWduZWQgbWFpbigpewogICAgY2luLnRpZSgwKSAtPiBzeW5jX3dpdGhfc3RkaW8oMCk7CgogICAgY2luID4+biA+Pm0gPj50OwoKICAgIHJlcChpLCAxLCBtKXsKICAgICAgICBpbnQgdSwgdiwgdzsgY2luID4+dSA+PnYgPj53OwoKICAgICAgICBlZGdlcy5wYih7dSwgdiwgd30pOwogICAgICAgIGFbdV0ucGIoe3YsIHd9KTsgYVt2XS5wYih7dSwgd30pOwogICAgfSAgICAKCiAgICBzb3J0KGFsbChlZGdlcyksIFtdKGNvbnN0IGVkZ2UgJmEsIGNvbnN0IGVkZ2UgJmIpewogICAgICAgIHJldHVybiBhLncgPCBiLnc7CiAgICB9KTsKCiAgICBkc3UuaW5pdChuKTsKCiAgICBmb3IgKGF1dG8gW3UsIHYsIHddOiBlZGdlcyl7CiAgICAgICAgaWYgKGRzdS51bml0ZSh1LCB2KSl7CiAgICAgICAgICAgIGJbdV0ucGIoe3YsIHd9KTsgYlt2XS5wYih7dSwgd30pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICh1c2VkW3VdID09IDApIG5vZGVzLnBiKHUpLCB1c2VkW3VdID0gMTsKICAgICAgICAgICAgaWYgKHVzZWRbdl0gPT0gMCkgbm9kZXMucGIodiksIHVzZWRbdl0gPSAxOwogICAgICAgIH0KICAgIH0gICAKCiAgICBkZnMoMSk7IAogICAgcmVwKGksIDAsIChpbnQpbm9kZXMuc2l6ZSgpIC0gMSkgZGlqa3N0cmEoZGlzdFtpXSwgbm9kZXNbaV0pOwoKICAgIHdoaWxlICh0LS0pewogICAgICAgIGludCB1LCB2OyBjaW4gPj51ID4+djsKCiAgICAgICAgY291dCA8PHF1ZXJ5KHUsIHYpIDw8J1xuJzsKICAgIH0KCiAgICByZXR1cm4gMDsKfQ==