#include <bits/stdc++.h>
using namespace std;
const long long N = 8e5 + 8;
inline long long read() {
  char c = getchar();
  long long s = 0;
  while (c < '0' || c > '9') c = getchar();
  while (c >= '0' && c <= '9') {
    s = s * 10 + c - '0';
    c = getchar();
  }
  return s;
}
struct node {
  long long next, to, dis, from;
} a[N * 2];
long long head[N], cnt = 1, n, m, qq, x, y, z;
const long long INF = 9e17;
struct No {
  long long id, val;
  bool operator<(const No& x) const { return val > x.val; }
};
priority_queue<No> q;
long long pd[N], dis[N], pre[N], dl[N], dr[N], bj[N], pb[N], rr[N], ll[N], tot,
    pl[N], pr[N], summ[N * 4];
void add(long long e, long long r, long long t) {
  a[++cnt] = {head[e], r, t, e};
  head[e] = cnt;
}
void dfs(long long u) {
  if (!pre[u]) return;
  dfs(a[pre[u]].from);
  pb[pre[u]] = pb[(pre[u] ^ 1)] = ++tot;
  rr[a[pre[u]].from] = ll[u] = pb[pre[u]];
  bj[u] = 1;
  pl[u] = pr[u] = u;
}
void diji() {
  for (long long i = 1; i <= n; i++) dis[i] = INF;
  q.push((No){1, 0});
  dis[1] = 0;
  while (!q.empty()) {
    No u = q.top();
    q.pop();
    if (pd[u.id]) continue;
    pd[u.id] = 1;
    for (long long i = head[u.id]; i; i = a[i].next) {
      if (dis[a[i].to] > dis[u.id] + a[i].dis) {
        dis[a[i].to] = dis[u.id] + a[i].dis;
        pre[a[i].to] = i;
        q.push((No){a[i].to, dis[a[i].to]});
      }
    }
  }
  dfs(n);
  bj[1] = 1;
  pr[1] = pl[1] = 1;
}
void dijis() {
  for (long long i = 1; i <= n; i++) dl[i] = INF, pd[i] = 0;
  dl[1] = 0;
  q.push((No){1, 0});
  pl[1] = 1;
  while (!q.empty()) {
    No u = q.top();
    q.pop();
    if (pd[u.id]) continue;
    pd[u.id] = 1;
    for (long long i = head[u.id]; i; i = a[i].next) {
      if (dl[a[i].to] > dl[u.id] + a[i].dis) {
        dl[a[i].to] = dl[u.id] + a[i].dis;
        if (!bj[a[i].to])
          pl[a[i].to] = pl[u.id];
        else
          pl[a[i].to] = a[i].to;
        q.push((No){a[i].to, dl[a[i].to]});
      }
    }
  }
}
void dijist() {
  for (long long i = 1; i <= n; i++) dr[i] = INF, pd[i] = 0;
  dr[n] = 0;
  q.push((No){n, 0});
  pr[n] = n;
  while (!q.empty()) {
    No u = q.top();
    q.pop();
    if (pd[u.id]) continue;
    pd[u.id] = 1;
    for (long long i = head[u.id]; i; i = a[i].next) {
      if (dr[a[i].to] > dr[u.id] + a[i].dis) {
        dr[a[i].to] = dr[u.id] + a[i].dis;
        if (!bj[a[i].to])
          pr[a[i].to] = pr[u.id];
        else
          pr[a[i].to] = a[i].to;
        q.push((No){a[i].to, dr[a[i].to]});
      }
    }
  }
}
bool flag = 0;
void add(long long u, long long l, long long r, long long L, long long R,
         long long k) {
  if (L <= l && R >= r) {
    summ[u] = min(summ[u], k);
    return;
  }
  if (L <= ((l + r) >> 1)) add((u << 1), l, ((l + r) >> 1), L, R, k);
  if (R > ((l + r) >> 1)) add((u << 1 | 1), ((l + r) >> 1) + 1, r, L, R, k);
}
long long query(long long u, long long l, long long r, long long L,
                long long R) {
  long long ans = summ[u];
  if (L <= l && R >= r) return ans;
  if (L <= ((l + r) >> 1))
    ans = min(ans, query((u << 1), l, ((l + r) >> 1), L, R));
  if (R > ((l + r) >> 1))
    ans = min(ans, query((u << 1 | 1), ((l + r) >> 1) + 1, r, L, R));
  return ans;
}
long long tq = 0;
long long jx[N], jy[N], jz[N];
void build(long long u, long long l, long long r) {
  summ[u] = INF;
  if (l == r) {
    return;
  }
  build((u << 1), l, ((l + r) >> 1));
  build((u << 1 | 1), ((l + r) >> 1) + 1, r);
}
signed main() {
  n = read();
  m = read();
  qq = read();
  for (long long i = 1; i <= m; i++) {
    x = read();
    y = read();
    z = read();
    if (i == 1) tq = x;
    jx[i] = x;
    jy[i] = y;
    jz[i] = z;
    add(x, y, z);
    add(y, x, z);
  }
  diji();
  dijis();
  dijist();
  build(1, 1, tot);
  for (long long i = 2; i <= cnt; i++) {
    if (pb[i]) continue;
    if (rr[pl[a[i].from]] <= ll[pr[a[i].to]] && rr[pl[a[i].from]])
      add(1, 1, tot, rr[pl[a[i].from]], ll[pr[a[i].to]],
          a[i].dis + dl[a[i].from] + dr[a[i].to]);
  }
  for (long long i = 1; i <= qq; i++) {
    x = read();
    y = read();
    long long u = x * 2 + 1;
    if (pb[u]) {
      if (y < a[u].dis) {
        printf("%lld\n", dis[n] - (a[u].dis - y));
      } else {
        printf("%lld\n",
               min(query(1, 1, tot, pb[u], pb[u]), dis[n] + (y - a[u].dis)));
      }
    } else {
      if (y > a[u].dis) {
        printf("%lld\n", dis[n]);
      } else {
        printf("%lld\n", min(dis[n], min(dl[a[u].from] + y + dr[a[u].to],
                                         dl[a[u].to] + dr[a[u].from] + y)));
      }
    }
  }
  return 0;
}
