#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
const int N = 100010;
int n, m, k, dis[N], vis[N], head[N], cnt;
struct Edge {
int v, w, next;
} edge[2 * N];
struct Node {
int dist, id;
Node(int d = 0, int i = 0) : dist(d), id(i) {}
bool operator>(const Node& other) const {
return dist > other.dist;
}
};
priority_queue<Node, vector<Node>, greater<Node>> q;
void add(int u, int v, int w) {
edge[++cnt].v = v;
edge[cnt].w = w;
edge[cnt].next = head[u];
head[u] = cnt;
}
int main() {
scanf("%d%d%d", &n, &m, &k);
for (int i = 1; i <= m; i++) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
add(u, v, w);
add(v, u, w);
}
while (k--) {
int x, y;
scanf("%d%d", &x, &y);
for (int i = 1; i <= n; i++) {
dis[i] = 0x3f3f3f3f;
vis[i] = 0;
}
dis[1] = 0;
q.push(Node(0, 1));
while (!q.empty()) {
Node cur = q.top();
q.pop();
int u = cur.id;
if (vis[u]) continue;
vis[u] = 1;
for (int i = head[u]; i; i = edge[i].next) {
int v = edge[i].v, w = edge[i].w;
if (dis[v] > dis[u] + w) {
dis[v] = dis[u] + w;
q.push(Node(dis[v], v));
}
}
}
printf("%d\n", dis[x] + dis[y]);
}
return 0;
}