#include <bits/stdc++.h>
using namespace std;
const int N = 400005;
const int M = 400005;
const long long inf = 0x3f3f3f3f3f3f3f3f;
long long d[2][N], w[M];
int u[M], v[M], head[N], fa[2][N], f[2][N], ft[2][N], id[N], mni[N], mnn[N],
    cnt, n, m, q;
bool vis[N], in[N], tag[M];
priority_queue<pair<long long, int> > pq;
struct edge {
  int to, next;
  long long cost;
} g[M << 1];
void add(int x, int y, int z) {
  g[++cnt].to = y;
  g[cnt].next = head[x];
  head[x] = cnt;
  g[cnt].cost = z;
}
void dij(int s, int opt) {
  for (int i = 1; i <= n; i++) d[opt][i] = inf;
  memset(vis, 0, sizeof(vis));
  d[opt][s] = 0;
  pq.push(make_pair(-d[opt][s], s));
  while (pq.size()) {
    int x = pq.top().second;
    pq.pop();
    if (vis[x]) continue;
    vis[x] = 1;
    for (int i = head[x]; i; i = g[i].next) {
      int y = g[i].to;
      if (d[opt][y] - d[opt][x] > g[i].cost)
        fa[opt][y] = x, ft[opt][y] = i, d[opt][y] = d[opt][x] + g[i].cost,
        pq.push(make_pair(-d[opt][y], y));
    }
  }
}
void dfs(int x, int opt, int ff) {
  f[opt][x] = id[ff];
  for (int i = head[x]; i; i = g[i].next) {
    int y = g[i].to;
    if (i != ft[opt][y] || fa[opt][y] != x) continue;
    if (!in[y])
      dfs(y, opt, ff);
    else
      dfs(y, opt, y);
  }
}
struct SegTree {
  int l, r;
  long long mn;
} t[N << 2];
void build(int l, int r, int p) {
  t[p].l = l;
  t[p].r = r;
  t[p].mn = inf;
  if (l == r) return;
  int mid = (l + r) >> 1;
  build(l, mid, p * 2);
  build(mid + 1, r, p * 2 + 1);
}
void change(int l, int r, int p, long long x) {
  if (l > r) return;
  if (l <= t[p].l && t[p].r <= r) {
    t[p].mn = min(t[p].mn, x);
    return;
  }
  int mid = (t[p].l + t[p].r) >> 1;
  if (l <= mid) change(l, r, p * 2, x);
  if (r > mid) change(l, r, p * 2 + 1, x);
}
long long find(int x, int p) {
  if (t[p].l == t[p].r) return t[p].mn;
  int mid = (t[p].l + t[p].r) >> 1;
  long long res = t[p].mn;
  if (x <= mid)
    res = min(res, find(x, p * 2));
  else
    res = min(res, find(x, p * 2 + 1));
  return res;
}
bool check(int x, int y) {
  return in[x] && in[y] && (id[x] == id[y] + 1 || id[y] == id[x] + 1);
}
int main() {
  scanf("%d%d%d", &n, &m, &q);
  for (int i = 1; i <= m; i++) {
    scanf("%d%d%lld", &u[i], &v[i], &w[i]);
    add(u[i], v[i], w[i]);
    add(v[i], u[i], w[i]);
  }
  dij(1, 0);
  dij(n, 1);
  cnt = 0;
  for (int x = 1; x != n; x = fa[1][x]) in[x] = 1, id[x] = ++cnt;
  in[n] = 1;
  id[n] = ++cnt;
  dfs(1, 0, 1);
  dfs(n, 1, n);
  build(1, n, 1);
  memset(mnn, 0x3f, sizeof(mnn));
  for (int i = 1; i <= m; i++) {
    int x = u[i], y = v[i];
    if (check(x, y)) {
      if (w[i] < mnn[min(id[x], id[y])])
        mnn[min(id[x], id[y])] = w[i], mni[min(id[x], id[y])] = i;
    }
  }
  for (int i = 1; i <= cnt; i++)
    if (mni[i]) tag[mni[i]] = 1;
  for (int i = 1; i <= m; i++) {
    int x = u[i], y = v[i];
    if (tag[i]) continue;
    if (d[0][x] + d[1][y] > d[1][x] + d[0][y])
      change(f[0][y], f[1][x] - 1, 1, d[1][x] + d[0][y] + w[i]);
    else
      change(f[0][x], f[1][y] - 1, 1, d[0][x] + d[1][y] + w[i]);
  }
  for (int i = 1; i <= q; i++) {
    int a;
    long long b;
    scanf("%d%lld", &a, &b);
    int x = u[a], y = v[a];
    if (!tag[a])
      printf("%lld\n",
             min(min(d[0][n], d[0][x] + d[1][y] + b), d[0][y] + d[1][x] + b));
    else
      printf("%lld\n",
             min(d[1][x] + d[0][y] + b,
                 min(d[0][x] + d[1][y] + b, find(min(id[x], id[y]), 1))));
  }
}
