#include <bits/stdc++.h>
using namespace std;
const int N = 500005;
struct line {
  int x, y;
  long long z;
} s[N];
long long t[N << 2];
int n, m, q;
int hed1[N], tal1[N << 1];
long long val1[N << 1];
int nxt1[N << 1], cnt1 = 0;
int hed2[N], tal2[N << 1];
long long val2[N << 1];
int nxt2[N << 1], cnt2 = 0;
int hed3[N], tal3[N << 1];
long long val3[N << 1];
int nxt3[N << 1], cnt3 = 0;
int pre2[N], pre3[N];
bool used2[N];
long long dis2[N];
bool used3[N];
long long dis3[N];
int vl2[N], vl3[N];
bool isx[N] = {0};
struct aa {
  long long v;
  int pos;
};
bool operator<(const aa &a, const aa &b) { return a.v > b.v; }
priority_queue<aa> q2, q3;
int nod[N];
int fa1[N][21], fa2[N][21];
int dep1[N], dep2[N];
long long valop[N];
int lll[N], rrr[N];
void addege1(int x, int y, long long z) {
  cnt1++;
  tal1[cnt1] = y;
  val1[cnt1] = z;
  nxt1[cnt1] = hed1[x];
  hed1[x] = cnt1;
}
void addege2(int x, int y, long long z) {
  cnt2++;
  tal2[cnt2] = y;
  val2[cnt2] = z;
  nxt2[cnt2] = hed2[x];
  hed2[x] = cnt2;
}
void addege3(int x, int y, long long z) {
  cnt3++;
  tal3[cnt3] = y;
  val3[cnt3] = z;
  nxt3[cnt3] = hed3[x];
  hed3[x] = cnt3;
}
void push2(long long v, int pos) {
  aa a;
  a.pos = pos, a.v = v;
  q2.push(a);
}
void push3(long long v, int pos) {
  aa a;
  a.pos = pos, a.v = v;
  q3.push(a);
}
void dijkstra2() {
  memset(used2, 0, sizeof(used2));
  memset(dis2, -1, sizeof(dis2));
  for (int i = 1; i <= n; i++) {
    dis2[i] = 2147483647000000;
    used2[i] = 0;
  }
  dis2[1] = 0;
  push2(0, 1);
  while (!q2.empty()) {
    aa u = q2.top();
    q2.pop();
    if (used2[u.pos] == 1) continue;
    used2[u.pos] = 1;
    for (int i = hed1[u.pos]; i; i = nxt1[i]) {
      int v = tal1[i];
      if (used2[v] == 0 && dis2[v] > u.v + val1[i]) {
        pre2[v] = u.pos;
        vl2[v] = val1[i];
        dis2[v] = dis2[u.pos] + val1[i];
        push2(dis2[v], v);
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    if (i != 1) {
      addege2(i, pre2[i], vl2[i]);
      addege2(pre2[i], i, vl2[i]);
    }
  }
}
void dijkstra3() {
  memset(used3, 0, sizeof(used3));
  memset(dis3, -1, sizeof(dis3));
  for (int i = 1; i <= n; i++) {
    dis3[i] = 2147483647000000;
    used3[i] = 0;
  }
  dis3[n] = 0;
  push3(0, n);
  while (!q3.empty()) {
    aa u = q3.top();
    q3.pop();
    if (used3[u.pos] == 1) continue;
    used3[u.pos] = 1;
    for (int i = hed1[u.pos]; i; i = nxt1[i]) {
      int v = tal1[i];
      if (used3[v] == 0 && dis3[v] > u.v + val1[i]) {
        pre3[v] = u.pos;
        vl3[v] = val1[i];
        dis3[v] = dis3[u.pos] + val1[i];
        push3(dis3[v], v);
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    if (i != n) {
      addege3(i, pre3[i], vl3[i]);
      addege3(pre3[i], i, vl3[i]);
    }
  }
}
void dfs1(int u, int fa, int vv) {
  lll[u] = vv;
  for (int i = hed2[u]; i; i = nxt2[i]) {
    int v = tal2[i], val = val2[i];
    if (v == fa) continue;
    dep1[v] = dep1[u] + 1;
    fa1[v][0] = u;
    if (nod[v] == -1)
      dfs1(v, u, vv);
    else
      dfs1(v, u, nod[v]);
  }
}
void dfs2(int u, int fa, int vv) {
  rrr[u] = vv;
  for (int i = hed3[u]; i; i = nxt3[i]) {
    int v = tal3[i], val = val3[i];
    if (v == fa) continue;
    dep2[v] = dep2[u] + 1;
    fa2[v][0] = u;
    if (nod[v] == -1)
      dfs2(v, u, vv);
    else
      dfs2(v, u, nod[v]);
  }
}
void build(int l, int r, int num) {
  t[num] = 2147483647000000ll;
  if (l == r) return;
  int mid = (l + r) >> 1;
  build(l, mid, num << 1);
  build(mid + 1, r, num << 1 | 1);
}
void modify(int l, int r, int num, int L, int R, long long SUM) {
  if (l > R || r < L) return;
  if (l >= L && r <= R) {
    t[num] = min(t[num], SUM);
    return;
  }
  int mid = (l + r) >> 1;
  modify(l, mid, num << 1, L, R, SUM);
  modify(mid + 1, r, num << 1 | 1, L, R, SUM);
}
long long ask(int l, int r, int num, int K) {
  if (l > K || r < K) return 2147483647000000ll;
  if (l == r) return t[num];
  int mid = (l + r) >> 1;
  return min(t[num],
             min(ask(l, mid, num << 1, K), ask(mid + 1, r, num << 1 | 1, K)));
}
int lca1(int x, int y) {
  if (dep1[x] > dep1[y]) swap(x, y);
  for (int i = 20; i >= 0; i--)
    if (dep1[fa1[y][i]] >= dep1[y]) y = fa1[y][i];
  if (x == y) return x;
  for (int i = 20; i >= 0; i--)
    if (fa1[x][i] != fa1[y][i]) x = fa1[x][i], y = fa1[y][i];
  return fa1[x][0];
}
int lca2(int x, int y) {
  if (dep2[x] > dep2[y]) swap(x, y);
  for (int i = 20; i >= 0; i--)
    if (dep2[fa2[y][i]] >= dep2[y]) y = fa2[y][i];
  if (x == y) return x;
  for (int i = 20; i >= 0; i--)
    if (fa2[x][i] != fa2[y][i]) x = fa2[x][i], y = fa2[y][i];
  return fa2[x][0];
}
int cnt;
void calc(int u, int v, long long valve) {
  modify(1, cnt, 1, lll[u], rrr[v] - 1, dis2[u] + valve + dis3[v]);
}
long long len;
bool check(int i) {
  if (min(dis2[s[i].x] + dis3[s[i].y] + s[i].z,
          dis3[s[i].x] + dis2[s[i].y] + s[i].z) == len)
    return 1;
  return 0;
}
int main() {
  scanf("%d%d%d", &n, &m, &q);
  for (int i = 1; i <= m; i++) {
    int x, y;
    long long z;
    scanf("%d%d%lld", &x, &y, &z);
    s[i].x = x, s[i].y = y, s[i].z = z;
    addege1(x, y, z);
    addege1(y, x, z);
  }
  dijkstra2();
  dijkstra3();
  memset(nod, -1, sizeof(nod));
  int u = 1;
  cnt = 1;
  nod[1] = 1;
  while (pre3[u] != n) u = pre3[u], nod[u] = ++cnt;
  nod[n] = ++cnt;
  dep1[1] = 1, fa1[1][0] = 1;
  dfs1(1, 1, nod[1]);
  dep2[n] = 1, fa2[n][0] = n;
  dfs2(n, n, nod[n]);
  build(1, cnt, 1);
  for (int i = 1; i <= 20; i++) {
    for (int j = 1; j <= n; j++) {
      fa1[i][j] = fa1[fa1[i][j - 1]][j - 1];
      fa2[i][j] = fa2[fa2[i][j - 1]][j - 1];
    }
  }
  len = dis2[n];
  for (int i = 1; i <= m; i++) {
    if (check(i)) continue;
    calc(s[i].x, s[i].y, s[i].z);
    calc(s[i].y, s[i].x, s[i].z);
  }
  for (int i = 1; i < cnt; i++) valop[i] = ask(1, cnt, 1, i);
  for (int w = 1; w <= q; w++) {
    int t;
    long long X;
    scanf("%d%lld", &t, &X);
    if (check(t)) {
      if (X < s[t].z) {
        printf("%lld\n", len - s[t].z + X);
      } else {
        long long sum1 = len - s[t].z + X;
        int p = min(nod[s[t].x], nod[s[t].y]);
        printf("%lld\n", min(sum1, valop[p]));
      }
    } else {
      if (X < s[t].z) {
        int x = s[t].x, y = s[t].y;
        printf("%lld\n",
               min(len, min(dis2[x] + dis3[y] + X, dis3[x] + dis2[y] + X)));
      } else {
        printf("%lld\n", len);
      }
    }
  }
  return 0;
}
