#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <vector>
using namespace std;
const int MaxN = 10000;
struct node
{
int v, w, next;
}e[MaxN * 2 + 1];
struct Node
{
int v, i, next;
}E[MaxN * 200 + 1];
int n, m, Q, cnt;
int ans[MaxN * 100 + 1], dist[MaxN + 1];
bool vis[MaxN + 1], mark[MaxN + 1];
int f[MaxN + 1], g[MaxN + 1], G[MaxN + 1];
void addedge(int u, int v, int w)
{
e[cnt].v = v;
e[cnt].w = w;
e[cnt].next = g[u];
g[u] = cnt++;
}
void add(int u, int v, int i)
{
E[cnt].v = v;
E[cnt].i = i;
E[cnt].next = G[u];
G[u] = cnt++;
}
int find(int x)
{
if (x != f[x])
f[x] = find(f[x]);
return f[x];
}
void tarjan(int u)
{
f[u] = u;
vis[u] = true;
for (int i = g[u]; i != -1; i = e[i].next)
{
int v = e[i].v, w = e[i].w;
if (vis[v])
continue;
dist[v] = dist[u] + w;
tarjan(v);
f[v] = u;
}
for (int i = G[u]; i != -1; i = E[i].next)
{
int v = E[i].v, j = E[i].i;
if (vis[v] && ans[j] == -1 && !mark[find(v)])
ans[j] = dist[u] + dist[v] - 2 * dist[find(v)];
}
}
int main()
{
while (~scanf("%d %d %d", &n, &m, &Q))
{
cnt = 0;
memset(g, -1, sizeof(g));
for (int i = 1; i <= m; i++)
{
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
addedge(u, v, w);
addedge(v, u, w);
}
memset(ans, -1, sizeof(ans));
cnt = 0;
memset(G, -1, sizeof(G));
for (int i = 1; i <= Q; i++)
{
int u, v;
scanf("%d %d", &u, &v);
add(u, v, i);
add(v, u, i);
}
memset(dist, 0, sizeof(dist));
memset(vis, 0, sizeof(vis));
memset(mark, 0, sizeof(mark));
for (int i = 1; i <= n; i++)
{
if (!vis[i])
{
dist[i] = 0;
tarjan(i);
mark[i] = 1;
}
}
for (int i = 1; i <= Q; i++)
{
if (ans[i] == -1)
printf("Not connected\n");
else
printf("%d\n", ans[i]);
}
}
return 0;
}