#include <bits/stdc++.h>
using namespace std;
struct hh {
  int p;
  long long w;
  bool operator<(hh a) const { return w > a.w; }
};
int cnt = 1, hd[200005], nx[200005 << 1], to[200005 << 1], w[200005 << 1],
    eg1[200005], eg2[200005], eg3[200005];
void add(int x, int y, int tp) {
  nx[++cnt] = hd[x];
  hd[x] = cnt;
  to[cnt] = y;
  w[cnt] = tp;
  nx[++cnt] = hd[y];
  hd[y] = cnt;
  to[cnt] = x;
  w[cnt] = tp;
}
long long dis1[200005], dis2[200005];
int fa1[200005], fa2[200005], n, m;
priority_queue<hh> q;
void dj(int s, long long *dis, int *fa) {
  for (int i = 1; i <= n; ++i) dis[i] = 1e18;
  dis[s] = 0;
  while (!q.empty()) q.pop();
  q.push((hh){s, dis[s]});
  while (q.size()) {
    int p = q.top().p;
    long long s = q.top().w;
    q.pop();
    if (s > dis[p]) continue;
    for (int i = hd[p]; i; i = nx[i]) {
      int v = to[i];
      if (dis[v] > s + w[i]) {
        dis[v] = s + w[i];
        q.push((hh){v, dis[v]});
        fa[v] = i;
      }
    }
  }
}
int mk[200005], sk[200005], pr1[200005], pr2[200005], ls[200005];
bool cmp1(int x, int y) { return dis1[x] < dis1[y]; }
bool cmp2(int x, int y) { return dis2[x] < dis2[y]; }
long long mi[200005 << 2];
void build(int p, int l, int r) {
  mi[p] = 1e18;
  if (l == r) return;
  int mid = (l + r) >> 1;
  build(p << 1, l, mid);
  build(p << 1 | 1, mid + 1, r);
}
void update(int p, int l, int r, int L, int R, long long w) {
  if (l == L && r == R) {
    mi[p] = min(mi[p], w);
    return;
  }
  int mid = (l + r) >> 1;
  if (R <= mid)
    update(p << 1, l, mid, L, R, w);
  else if (L > mid)
    update(p << 1 | 1, mid + 1, r, L, R, w);
  else
    update(p << 1, l, mid, L, mid, w),
        update(p << 1 | 1, mid + 1, r, mid + 1, R, w);
}
long long query(int p, int l, int r, int x) {
  if (l == r) return mi[p];
  int mid = (l + r) >> 1;
  if (x <= mid)
    return min(mi[p], query(p << 1, l, mid, x));
  else
    return min(mi[p], query(p << 1 | 1, mid + 1, r, x));
}
int main() {
  int q;
  scanf("%d%d%d", &n, &m, &q);
  for (int i = 1, x, y, w; i <= m; ++i) {
    scanf("%d%d%d", &x, &y, &w);
    add(x, y, w);
    eg1[i] = x;
    eg2[i] = y;
    eg3[i] = w;
  }
  dj(1, dis1, fa1);
  dj(n, dis2, fa2);
  int tp = n, cnt = 0;
  while (tp) {
    sk[++cnt] = tp;
    if (!fa1[tp]) break;
    mk[fa1[tp] >> 1] = 1;
    tp = to[fa1[tp] ^ 1];
  }
  for (int i = 1; i <= cnt / 2; ++i) swap(sk[i], sk[cnt - i + 1]);
  for (int i = 1; i <= cnt; ++i) pr1[sk[i]] = pr2[sk[i]] = i;
  for (int i = 1; i <= n; ++i) ls[i] = i;
  sort(ls + 1, ls + n + 1, cmp1);
  for (int i = 1; i <= n; ++i) {
    int x = ls[i];
    if (fa1[x]) {
      int v = to[fa1[x] ^ 1];
      if (!pr1[x]) pr1[x] = pr1[v];
    }
  }
  sort(ls + 1, ls + n + 1, cmp2);
  for (int i = 1; i <= n; ++i) {
    int x = ls[i];
    if (fa2[x]) {
      int v = to[fa2[x] ^ 1];
      if (!pr2[x]) pr2[x] = pr2[v];
    }
  }
  build(1, 1, n);
  for (int i = 1; i <= m; ++i)
    if (!mk[i]) {
      int l = pr1[eg1[i]], r = pr2[eg2[i]];
      if (l < r)
        update(1, 1, n, l, r - 1, dis1[eg1[i]] + dis2[eg2[i]] + eg3[i]);
      r = pr2[eg1[i]], l = pr1[eg2[i]];
      if (l < r)
        update(1, 1, n, l, r - 1, dis2[eg1[i]] + dis1[eg2[i]] + eg3[i]);
    }
  for (int i = 1; i <= q; ++i) {
    int x, t;
    scanf("%d%d", &x, &t);
    if (!mk[x]) {
      if (t > eg3[x])
        printf("%lld\n", dis1[n]);
      else
        printf("%lld\n", min(dis1[n], min(dis1[eg1[x]] + dis2[eg2[x]],
                                          dis1[eg2[x]] + dis2[eg1[x]]) +
                                          t));
    } else {
      if (t < eg3[x])
        printf("%lld\n", dis1[n] - eg3[x] + t);
      else {
        long long ans = dis1[n] + t - eg3[x];
        ans = min(ans, query(1, 1, n, min(pr1[eg1[x]], pr1[eg2[x]])));
        printf("%lld\n", ans);
      }
    }
  }
}
