#include <bits/stdc++.h>
const int maxn = 4e5 + 5;
using namespace std;
int n, m, q;
vector<int> ve[maxn];
int en[maxn], nt[maxn], owo = 1, len[maxn], la[maxn];
void adg(int x, int y, int z) {
  en[++owo] = y;
  nt[owo] = la[x];
  la[x] = owo;
  len[owo] = z;
  en[++owo] = x;
  nt[owo] = la[y];
  la[y] = owo;
  len[owo] = z;
}
struct node {
  long long didi;
  int to;
};
bool operator<(node aa, node bb) { return aa.didi > bb.didi; }
priority_queue<node> Q;
int QC, pre[maxn], ID[maxn];
long long dis[maxn], fdis[maxn];
bool mark[maxn];
void DJK(int S) {
  for (int i = 1; i <= n; i++) dis[i] = (1ll << 60), mark[i] = 0;
  Q.push((node){0, S});
  dis[S] = 0;
  while (Q.size()) {
    int x = Q.top().to;
    Q.pop();
    if (mark[x]) continue;
    mark[x] = 1;
    for (int it = la[x]; it; it = nt[it]) {
      int y = en[it];
      if (dis[y] > dis[x] + len[it]) {
        pre[y] = it;
        dis[y] = dis[x] + len[it];
        Q.push((node){dis[y], y});
      }
    }
  }
}
bool marke[maxn];
int O[maxn];
void dfs(int x) {
  for (auto y : ve[x]) {
    if (!ID[y]) ID[y] = ID[x];
    dfs(y);
  }
}
int rt, ls[maxn], rs[maxn], sgtot;
long long tg[maxn];
void maketree(int &p, int l, int r) {
  p = ++sgtot;
  tg[p] = (1ll << 60);
  if (l == r) return;
  int mid = (l + r) >> 1;
  maketree(ls[p], l, mid);
  maketree(rs[p], mid + 1, r);
}
void modify(int p, int l, int r, int x, int y, long long d) {
  if (tg[p] <= d) return;
  if (x <= l && r <= y) {
    tg[p] = d;
    return;
  }
  int mid = (l + r) >> 1;
  if (y <= mid)
    modify(ls[p], l, mid, x, y, d);
  else if (x > mid)
    modify(rs[p], mid + 1, r, x, y, d);
  else
    modify(ls[p], l, mid, x, y, d), modify(rs[p], mid + 1, r, x, y, d);
}
long long query(int p, int l, int r, int x) {
  if (l == r) return tg[p];
  int mid = (l + r) >> 1;
  if (x <= mid)
    return min(tg[p], query(ls[p], l, mid, x));
  else
    return min(tg[p], query(rs[p], mid + 1, r, x));
}
int main() {
  scanf("%d%d%d", &n, &m, &q);
  for (int i = 1; i <= m; i++) {
    int x, y, z;
    scanf("%d%d%d", &x, &y, &z);
    adg(x, y, z);
  }
  DJK(n);
  memcpy(fdis, dis, sizeof dis);
  DJK(1);
  for (int p = n; p != 1; p = en[pre[p] ^ 1])
    O[++QC] = p, marke[pre[p] >> 1] = 1;
  O[++QC] = 1;
  reverse(O + 1, O + 1 + QC);
  for (int i = 1; i <= QC; i++) ID[O[i]] = i;
  for (int i = 2; i <= n; i++) {
    if (pre[i] != 0) {
      ve[en[pre[i] ^ 1]].push_back(i);
    }
  }
  dfs(1);
  maketree(rt, 1, QC - 1);
  for (int i = 1; i <= n; i++) {
    for (int it = la[i]; it; it = nt[it]) {
      int y = en[it];
      if (ID[y] <= ID[i] || marke[it >> 1]) continue;
      modify(rt, 1, QC - 1, ID[i], ID[y] - 1, dis[i] + fdis[y] + len[it]);
    }
  }
  while (q--) {
    int T, V;
    scanf("%d%d", &T, &V);
    T <<= 1;
    if (marke[T >> 1]) {
      int x;
      if (ID[en[T]] < ID[en[T ^ 1]])
        x = en[T];
      else
        x = en[T ^ 1];
      printf("%lld\n", min(dis[n] - len[T] + V, query(rt, 1, QC - 1, ID[x])));
    } else {
      printf("%lld\n", min(dis[n], min(dis[en[T]] + fdis[en[T ^ 1]] + V,
                                       fdis[en[T]] + dis[en[T ^ 1]] + V)));
    }
  }
}
