#include <bits/stdc++.h>
using namespace std;
int n, m, Q, sl, fh, ln, l[200010], r[200010], ex[200010], id[200010],
    vis[200010], pre[200010];
long long ans, tr[200010 << 2], disS[200010], disT[200010];
int t, h[200010];
int rd() {
  sl = 0;
  fh = 1;
  char ch = getchar();
  while (ch < '0' || '9' < ch) {
    if (ch == '-') fh = -1;
    ch = getchar();
  }
  while ('0' <= ch && ch <= '9') sl = sl * 10 + ch - '0', ch = getchar();
  return sl * fh;
}
struct EDGE {
  int u, v, w;
} E[200010];
struct edge {
  int to, val, nxt;
} e[200010 << 1];
void add(int u, int v, int w) {
  e[++t] = (edge){v, w, h[u]};
  h[u] = t;
  e[++t] = (edge){u, w, h[v]};
  h[v] = t;
}
struct node {
  int v;
  long long dis;
  bool operator<(const node &x) const { return dis > x.dis; }
};
priority_queue<node> q;
void Dij(int S, long long *dis, int flg = 0) {
  memset(dis + 1, 127 / 3, sizeof(long long) * n);
  memset(vis + 1, 0, sizeof(int) * n);
  q.push((node){S, dis[S] = 0});
  static int u, v;
  while (!q.empty()) {
    u = q.top().v;
    q.pop();
    if (!vis[u])
      for (int i = h[u]; i; i = e[i].nxt)
        if (dis[v = e[i].to] > dis[u] + e[i].val) {
          dis[v] = dis[u] + e[i].val;
          q.push((node){v, dis[v]});
          if (flg && !ex[v]) {
            if (flg == 1)
              l[v] = l[u];
            else
              r[v] = r[u];
          } else
            pre[v] = i;
        }
    vis[u] = 1;
  }
}
void build(int x, int l, int r) {
  tr[x] = 1e18;
  if (l == r) return;
  build(x << 1, l, ((l + r) >> 1));
  build(x << 1 | 1, ((l + r) >> 1) + 1, r);
}
void init() {
  l[1] = r[1] = 0;
  ex[1] = 1;
  int i, x, p = 1;
  for (i = 1; p != n; ++i) {
    x = pre[p] >> 1;
    id[x] = i;
    p = e[pre[p] ^ 1].to;
    l[p] = r[p] = i;
    ex[p] = 1;
  }
  ln = i - 1;
  build(1, 1, ln);
}
void update(int x, int l, int r, int L, int R, long long v) {
  if (L <= l && r <= R) {
    tr[x] = min(tr[x], v);
    return;
  }
  if (L <= ((l + r) >> 1)) update(x << 1, l, ((l + r) >> 1), L, R, v);
  if (R > ((l + r) >> 1)) update(x << 1 | 1, ((l + r) >> 1) + 1, r, L, R, v);
}
long long query(int x, int l, int r, int p) {
  if (l == r) return tr[x];
  long long ret = tr[x];
  if (p <= ((l + r) >> 1))
    ret = min(ret, query(x << 1, l, ((l + r) >> 1), p));
  else
    ret = min(ret, query(x << 1 | 1, ((l + r) >> 1) + 1, r, p));
  return ret;
}
int main() {
  n = rd();
  m = rd();
  Q = rd();
  t = 1;
  int x, y, z;
  for (int i = 1; i <= m; ++i)
    x = rd(), y = rd(), z = rd(), add(x, y, z), E[i] = (EDGE){x, y, z};
  Dij(n, disT);
  init();
  Dij(1, disS, 1);
  Dij(n, disT, 2);
  for (int i = 1; i <= m; ++i)
    if (!id[i]) {
      if (l[E[i].u] + 1 <= r[E[i].v])
        update(1, 1, ln, l[E[i].u] + 1, r[E[i].v],
               disS[E[i].u] + E[i].w + disT[E[i].v]);
      if (l[E[i].v] + 1 <= r[E[i].u])
        update(1, 1, ln, l[E[i].v] + 1, r[E[i].u],
               disS[E[i].v] + E[i].w + disT[E[i].u]);
    }
  while (Q--) {
    x = rd();
    z = rd();
    if (id[x]) {
      ans = disS[n] - E[x].w + z;
      if (z > E[x].w) ans = min(ans, query(1, 1, ln, id[x]));
    } else {
      ans = disS[n];
      if (z < E[x].w)
        ans = min(ans, min(disS[E[x].u] + z + disT[E[x].v],
                           disS[E[x].v] + z + disT[E[x].u]));
    }
    printf("%lld\n", ans);
  }
  return 0;
}
