#include <bits/stdc++.h>
using namespace std;
inline long long read() {
  long long x = 0, f = 1, c = getchar();
  while (c < 48) c == '-' && (f = -1), c = getchar();
  while (c > 47) x = x * 10 + c - '0', c = getchar();
  return x * f;
}
const long long INF = 1ll << 62;
const long long MAXN = 300005;
struct Edge {
  long long to, val, num;
};
std::vector<Edge> G[MAXN];
long long id[MAXN << 2], l[MAXN], r[MAXN], vis[MAXN], b[MAXN];
long long s[MAXN], fr[MAXN], to[MAXN], val[MAXN];
long long dis[MAXN][2], t[MAXN << 2];
long long n, m, qr, tot, top, cnt;
inline void addedge(long long u, long long v, long long w, long long id) {
  G[u].push_back(Edge{v, w, id});
  G[v].push_back(Edge{u, w, id});
}
void dijkstra(long long s, long long type) {
  priority_queue<pair<long long, long long>> q;
  memset(vis, 0, sizeof(vis));
  dis[s][type] = 0;
  q.push(make_pair(0, s));
  while (!q.empty()) {
    long long x = q.top().second;
    q.pop();
    if (vis[x]) continue;
    vis[x] = 1;
    for (Edge e : G[x])
      if (dis[e.to][type] > dis[x][type] + e.val) {
        dis[e.to][type] = dis[x][type] + e.val;
        q.push(make_pair(-dis[e.to][type], e.to));
      }
  }
}
void dfs(long long x) {
  vis[x] = 1;
  for (Edge e : G[x])
    if (!vis[e.to] && dis[x][0] + dis[e.to][1] + e.val == dis[n][0])
      return l[x] = r[e.to] = id[e.num] = ++cnt, dfs(e.to);
}
void sol(long long x, long long ind, long long type) {
  for (Edge e : G[x])
    if (dis[x][type] + e.val == dis[e.to][type])
      if (!vis[e.to] && !(type ? r : l)[e.to])
        (type ? r : l)[e.to] = ind, sol(e.to, ind, type);
}
void modify(long long x, long long l, long long r, long long ql, long long qr,
            long long k) {
  if (ql <= l && r <= qr) return t[x] = min(t[x], k), void();
  long long mid = (l + r) >> 1;
  if (ql <= mid) modify(x << 1, l, mid, ql, qr, k);
  if (qr > mid) modify(x << 1 | 1, mid + 1, r, ql, qr, k);
}
inline long long query(long long x, long long l, long long r, long long k) {
  if (l == r) return t[x];
  long long mid = (l + r) >> 1, res = t[x];
  if (k <= mid) res = min(res, query(x << 1, l, mid, k));
  if (k > mid) res = min(res, query(x << 1 | 1, mid + 1, r, k));
  return res;
}
inline void calc(long long x, long long k) {
  long long dx = dis[fr[x]][0] + dis[to[x]][1];
  long long dy = dis[fr[x]][1] + dis[to[x]][0];
  printf("%lld\n", min(dis[n][0], min(dx, dy) + k));
}
int main(int argc, char const *argv[]) {
  n = read();
  m = read();
  qr = read();
  for (long long i = 1; i <= m; ++i) {
    fr[i] = read();
    to[i] = read();
    val[i] = read();
    addedge(fr[i], to[i], val[i], i);
  }
  memset(t, 0x3f, sizeof(t));
  memset(dis, 0x3f, sizeof(dis));
  dijkstra(1, 0);
  dijkstra(n, 1);
  memset(vis, 0, sizeof(vis));
  s[0] = 1;
  top = 0;
  dfs(1);
  for (long long i = 1; i <= n; ++i)
    if (vis[i] && l[i]) sol(i, l[i], 0);
  for (long long i = n; i; --i)
    if (vis[i] && r[i]) sol(i, r[i], 1);
  for (long long i = 1; i <= m; ++i) {
    if (id[i] == 0 && l[fr[i]] && r[to[i]])
      modify(1, 1, cnt, l[fr[i]], r[to[i]],
             dis[fr[i]][0] + dis[to[i]][1] + val[i]);
    if (id[i] == 0 && l[to[i]] && r[fr[i]])
      modify(1, 1, cnt, l[to[i]], r[fr[i]],
             dis[to[i]][0] + dis[fr[i]][1] + val[i]);
  }
  for (long long i = 1, x, k, v; i <= qr; ++i) {
    x = read();
    k = read();
    v = dis[n][0] - val[x] + k;
    if (id[x] && k <= val[x]) printf("%lld\n", v);
    if (id[x] && k > val[x]) printf("%lld\n", min(v, query(1, 1, cnt, id[x])));
    if (!id[x]) calc(x, k);
  }
  return 0;
}
