#include <bits/stdc++.h>
using namespace std;
const long long inf = 0x3f3f3f3f3f3f3f3f;
long long n, m, q, cnt, tot = 0, hd[200005], valop[200005], dis1[200005],
                        pre[200005], pre1[200005], pre_dis[200005],
                        pre_dis1[200005], dis2[200005], cnt1, hd1[200005], cnt2,
                        hd2[200005], pos[200005], pos1[200005], dfn[200005];
bool is[200005] = {0};
struct node {
  long long from, to, dis, next;
} e[400005], t1[400005], t2[400005];
struct Nodee {
  long long x, y, z;
} ee[200005];
long long read() {
  long long f = 0, w = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') w = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    f = f * 10 + ch - '0';
    ch = getchar();
  }
  return f * w;
}
void addedge(long long x, long long y, long long z) {
  e[++cnt].dis = z;
  e[cnt].next = hd[x];
  e[cnt].to = y;
  e[cnt].from = x;
  hd[x] = cnt;
}
void addedge1(long long x, long long y, long long z) {
  t1[++cnt1].dis = z;
  t1[cnt1].next = hd1[x];
  t1[cnt1].to = y;
  t1[cnt1].from = x;
  hd1[x] = cnt1;
}
void addedge2(long long x, long long y, long long z) {
  t2[++cnt2].dis = z;
  t2[cnt2].next = hd2[x];
  t2[cnt2].to = y;
  t2[cnt2].from = x;
  hd2[x] = cnt2;
}
struct Node {
  long long u, d;
  bool operator<(const Node &a) const { return d > a.d; }
};
void dijkstra() {
  priority_queue<Node> q;
  memset(dis1, 0x3f, sizeof(dis1));
  dis1[1] = 0;
  q.push((Node){1, 0});
  while (!q.empty()) {
    Node now = q.top();
    q.pop();
    long long d = now.d, u = now.u;
    if (dis1[u] != d) continue;
    for (long long i = hd[u]; i; i = e[i].next) {
      long long to = e[i].to;
      if (dis1[to] > dis1[u] + e[i].dis) {
        dis1[to] = dis1[u] + e[i].dis;
        pre[to] = u;
        pre_dis[to] = e[i].dis;
        q.push((Node){to, dis1[to]});
      }
    }
  }
  for (long long i = 1; i <= n; i++) {
    if (i != 1) {
      addedge1(i, pre[i], pre_dis[i]);
      addedge1(pre[i], i, pre_dis[i]);
    }
  }
}
void dijkstra1() {
  priority_queue<Node> q;
  memset(dis2, 0x3f, sizeof(dis2));
  dis2[n] = 0;
  q.push((Node){n, 0});
  while (!q.empty()) {
    Node now = q.top();
    q.pop();
    long long d = now.d, u = now.u;
    if (dis2[u] != d) continue;
    for (long long i = hd[u]; i; i = e[i].next) {
      long long to = e[i].to;
      if (dis2[to] > dis2[u] + e[i].dis) {
        dis2[to] = dis2[u] + e[i].dis;
        pre1[to] = u;
        pre_dis1[to] = e[i].dis;
        q.push((Node){to, dis2[to]});
      }
    }
  }
  for (long long i = 1; i <= n; i++) {
    if (i != n) {
      addedge2(i, pre1[i], pre_dis1[i]);
      addedge2(pre1[i], i, pre_dis1[i]);
    }
  }
}
void dfs1(long long x, long long ff, long long vv) {
  pos[x] = vv;
  for (long long i = hd1[x]; i; i = t1[i].next) {
    long long to = t1[i].to;
    if (to != ff) {
      if (dfn[to] == -1)
        dfs1(to, x, vv);
      else
        dfs1(to, x, dfn[to]);
    }
  }
}
void dfs2(long long x, long long ff, long long vv) {
  pos1[x] = vv;
  for (long long i = hd2[x]; i; i = t2[i].next) {
    long long to = t2[i].to;
    if (to != ff) {
      if (dfn[to] == -1)
        dfs2(to, x, vv);
      else
        dfs2(to, x, dfn[to]);
    }
  }
}
struct tongyf {
  long long minn;
} tree[800005];
void build(long long tr, long long l, long long r) {
  tree[tr].minn = inf;
  if (l == r) return;
  long long mid = (l + r) / 2;
  build(tr * 2, l, mid);
  build(tr * 2 + 1, mid + 1, r);
}
void modify(long long tr, long long stdl, long long stdr, long long l,
            long long r, long long k) {
  if (l > stdr || r < stdl) return;
  if (l <= stdl && r >= stdr) {
    tree[tr].minn = min(tree[tr].minn, k);
    return;
  }
  long long mid = (stdl + stdr) / 2;
  modify(tr * 2, stdl, mid, l, r, k);
  modify(tr * 2 + 1, mid + 1, stdr, l, r, k);
}
long long query(long long tr, long long stdl, long long stdr, long long pos) {
  if (stdl > pos || stdr < pos) return inf;
  if (stdl == stdr) return tree[tr].minn;
  long long mid = (stdl + stdr) / 2;
  return min(tree[tr].minn, min(query(tr * 2, stdl, mid, pos),
                                query(tr * 2 + 1, mid + 1, stdr, pos)));
}
void change(long long x, long long y, long long len) {
  modify(1, 1, tot, pos[x], pos1[y] - 1, dis1[x] + dis2[y] + len);
}
bool check(long long i) {
  if (is[ee[i].x] == 0 || is[ee[i].y] == 0) return 0;
  if (min(dis1[ee[i].x] + dis2[ee[i].y] + ee[i].z,
          dis1[ee[i].y] + dis2[ee[i].x] + ee[i].z) == dis1[n])
    return 1;
  return 0;
}
signed main() {
  memset(dfn, 0, sizeof(dfn));
  n = read(), m = read(), q = read();
  for (long long i = 1; i <= m; i++) {
    long long x = read(), y = read(), z = read();
    ee[i].x = x, ee[i].y = y, ee[i].z = z;
    addedge(x, y, z);
    addedge(y, x, z);
  }
  dijkstra(), dijkstra1();
  memset(dfn, -1, sizeof(dfn));
  long long now = 1;
  tot = 1, is[1] = 1, dfn[1] = 1;
  while (pre1[now] != n) {
    now = pre1[now];
    dfn[now] = ++tot;
    is[now] = 1;
  }
  dfn[n] = ++tot, is[n] = 1;
  dfs1(1, 1, dfn[1]);
  dfs2(n, n, dfn[n]);
  build(1, 1, tot);
  long long len = dis1[n];
  for (long long i = 1; i <= m; i++) {
    if (check(i)) continue;
    change(ee[i].x, ee[i].y, ee[i].z);
    change(ee[i].y, ee[i].x, ee[i].z);
  }
  for (long long i = 1; i < tot; i++) valop[i] = query(1, 1, tot, i);
  for (long long i = 1; i <= q; i++) {
    long long t = read(), x = read();
    if (check(t)) {
      if (x < ee[t].z) {
        printf("%lld\n", len - ee[t].z + x);
      } else {
        long long sum1 = len - ee[t].z + x;
        long long p = min(dfn[ee[t].x], dfn[ee[t].y]);
        printf("%lld\n", min(sum1, valop[p]));
      }
    } else {
      if (x < ee[t].z) {
        long long a = ee[t].x, b = ee[t].y;
        printf("%lld\n",
               min(len, min(dis1[a] + dis2[b] + x, dis1[b] + dis2[a] + x)));
      } else
        printf("%lld\n", len);
    }
  }
  return 0;
}
