#include <bits/stdc++.h>
using namespace std;
const long long INF = 0x3f3f3f3f3f3f3f3f;
const int N = 200005;
long long dis1[N], dis2[N];
int head[N], edgenum = 0, p1[N][22], p2[N][22], tid[N], tot = 0, lst2[N],
             lst1[N], n, m, q, vis1[N], vis2[N], dep1[N], dep2[N];
vector<int> v1[N], v2[N];
struct Edge {
  int nxt, to;
  long long w;
} edge[2 * N];
inline int read() {
  int f = 1, x = 0;
  char ch = getchar();
  while (ch > '9' || ch < '0') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return f * x;
}
inline void addedge(int from, int to, int w) {
  edge[++edgenum].nxt = head[from];
  edge[edgenum].to = to;
  edge[edgenum].w = w;
  head[from] = edgenum;
}
inline void dij1(int s) {
  memset(dis1, INF, sizeof(dis1));
  dis1[s] = 0;
  priority_queue<pair<long long, int> > q;
  q.push(make_pair(0, s));
  while (!q.empty()) {
    int now = q.top().second;
    q.pop();
    if (vis1[now]) continue;
    vis1[now] = 1;
    v1[lst1[now]].push_back(now);
    for (int i = head[now]; i; i = edge[i].nxt)
      if (dis1[edge[i].to] > dis1[now] + edge[i].w)
        dis1[edge[i].to] = dis1[now] + edge[i].w,
        q.push(make_pair(-dis1[edge[i].to], edge[i].to)),
        lst1[edge[i].to] = now;
  }
}
inline void dij2(int s) {
  memset(dis2, INF, sizeof(dis2));
  dis2[s] = 0;
  priority_queue<pair<long long, int> > q;
  q.push(make_pair(0, s));
  while (!q.empty()) {
    int now = q.top().second;
    q.pop();
    if (vis2[now]) continue;
    vis2[now] = 1;
    v2[lst2[now]].push_back(now);
    for (int i = head[now]; i; i = edge[i].nxt)
      if (dis2[edge[i].to] > dis2[now] + edge[i].w)
        dis2[edge[i].to] = dis2[now] + edge[i].w,
        q.push(make_pair(-dis2[edge[i].to], edge[i].to)),
        lst2[edge[i].to] = now;
  }
}
inline void dfs1(int u, int fa) {
  p1[u][0] = fa, dep1[u] = dep1[fa] + 1;
  for (int i = (1), iend = (20); i <= iend; i++)
    p1[u][i] = p1[p1[u][i - 1]][i - 1];
  for (int i = (0), iend = (v1[u].size() - 1); i <= iend; i++)
    if (v1[u][i] != fa) dfs1(v1[u][i], u);
}
inline void dfs2(int u, int fa) {
  p2[u][0] = fa, dep2[u] = dep2[fa] + 1;
  for (int i = (1), iend = (20); i <= iend; i++)
    p2[u][i] = p2[p2[u][i - 1]][i - 1];
  for (int i = (0), iend = (v2[u].size() - 1); i <= iend; i++)
    if (v2[u][i] != fa) dfs2(v2[u][i], u);
}
inline int lca1(int x, int y) {
  if (dep1[x] > dep1[y]) swap(x, y);
  for (int i = (20), iend = (0); i >= iend; i--)
    if (dep1[x] <= dep1[y] - (1 << i)) y = p1[y][i];
  if (x == y) return x;
  for (int i = (20), iend = (0); i >= iend; i--) {
    if (p1[x][i] == p1[y][i]) continue;
    x = p1[x][i], y = p1[y][i];
  }
  return p1[x][0];
}
inline int lca2(int x, int y) {
  if (dep2[x] > dep2[y]) swap(x, y);
  for (int i = (20), iend = (0); i >= iend; i--)
    if (dep2[x] <= dep2[y] - (1 << i)) y = p2[y][i];
  if (x == y) return x;
  for (int i = (20), iend = (0); i >= iend; i--) {
    if (p2[x][i] == p2[y][i]) continue;
    x = p2[x][i], y = p2[y][i];
  }
  return p2[x][0];
}
inline void Path(int x) {
  if (x == 1) {
    tid[x] = ++tot;
    return;
  }
  Path(lst1[x]);
  tid[x] = ++tot;
}
struct Tree {
  int l, r;
  long long Min, tag;
} tree[N << 2];
inline void build(int root, int l, int r) {
  tree[root].l = l, tree[root].r = r, tree[root].Min = INF,
  tree[root].tag = INF;
  if (l == r) return;
  int mid = (l + r) >> 1;
  build(root << 1, l, mid);
  build(root << 1 | 1, mid + 1, r);
}
inline void push_down(int root) {
  if (tree[root].tag != INF) {
    tree[root << 1].Min = min(tree[root << 1].Min, tree[root].tag);
    tree[root << 1 | 1].Min = min(tree[root << 1 | 1].Min, tree[root].tag);
    tree[root << 1].tag = min(tree[root << 1].tag, tree[root].tag);
    tree[root << 1 | 1].tag = min(tree[root << 1 | 1].tag, tree[root].tag);
    tree[root].tag = INF;
  }
}
inline void add(int root, int l, int r, long long k) {
  if (l > r) return;
  if (l <= tree[root].l && tree[root].r <= r) {
    tree[root].Min = min(tree[root].Min, k);
    tree[root].tag = min(tree[root].tag, k);
    return;
  }
  push_down(root);
  if (tree[root << 1].r >= l) add(root << 1, l, r, k);
  if (tree[root << 1 | 1].l <= r) add(root << 1 | 1, l, r, k);
  tree[root].Min = min(tree[root << 1].Min, tree[root << 1 | 1].Min);
  return;
}
inline long long query(int root, int l, int r) {
  if (l <= tree[root].l && tree[root].r <= r) {
    return tree[root].Min;
  }
  push_down(root);
  long long s = INF;
  if (tree[root << 1].r >= l) s = min(s, query(root << 1, l, r));
  if (tree[root << 1 | 1].l <= r) s = min(s, query(root << 1 | 1, l, r));
  return s;
}
int main() {
  n = read(), m = read(), q = read();
  for (int i = (1), iend = (m); i <= iend; i++) {
    int x = read(), y = read(), z = read();
    addedge(x, y, z);
    addedge(y, x, z);
  }
  dij1(1);
  dij2(n);
  dfs1(1, 0);
  dfs2(n, 0);
  Path(n);
  build(1, 1, tot);
  for (int i = (1), iend = (m); i <= iend; i++) {
    int x = edge[i << 1].to, y = edge[(i << 1) - 1].to;
    if (dis1[x] + dis2[y] + edge[i << 1].w == dis1[n] ||
        dis1[y] + dis2[x] + edge[i << 1].w == dis1[n])
      continue;
    add(1, tid[lca1(x, n)] + 1, tid[lca2(y, 1)],
        dis1[x] + dis2[y] + edge[i << 1].w);
    add(1, tid[lca1(y, n)] + 1, tid[lca2(x, 1)],
        dis1[y] + dis2[x] + edge[i << 1].w);
  }
  for (int i = (1), iend = (q); i <= iend; i++) {
    int x = read(), y = read();
    int a = edge[x << 1].to, b = edge[(x << 1) - 1].to;
    if (dis1[a] + dis2[b] + edge[x << 1].w == dis1[n] ||
        dis1[b] + dis2[a] + edge[x << 1].w == dis1[n]) {
      if (y <= edge[x << 1].w)
        printf("%lld\n", dis1[n] - (edge[x << 1].w - y));
      else
        printf("%lld\n", min(query(1, max(tid[a], tid[b]), max(tid[a], tid[b])),
                             dis1[n] + y - edge[x << 1].w));
    } else {
      if (y > edge[x << 1].w)
        printf("%lld\n", dis1[n]);
      else
        printf("%lld\n",
               min(min(dis1[a] + dis2[b] + y, dis1[b] + dis2[a] + y), dis1[n]));
    }
  }
  return 0;
}
