#include <bits/stdc++.h>
int hmt() {
  int x = 0;
  int c = getchar(), n = 0;
  for (; !isdigit(c); c = getchar()) n = (c == '-');
  for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';
  if (n) x = -x;
  return x;
}
using namespace std;
const int maxn = 2e5 + 5;
vector<int> adj[maxn];
int U[maxn], V[maxn], W[maxn], len;
int N, M, Q, ind[maxn], on[maxn], le[maxn], ri[maxn], tr[maxn];
long long dist[2][maxn];
priority_queue<pair<long long, int>, vector<pair<long long, int>>,
               greater<pair<long long, int>>>
    pq;
long long ST[4 * maxn];
void upd(int L, int R, long long v, int id = 1, int l = 1, int r = len) {
  if (l > R || L > r || L > R) return;
  if (L <= l && r <= R) {
    ST[id] = min(ST[id], v);
    return;
  }
  int mid = (l + r) / 2;
  upd(L, R, v, id << 1, l, mid);
  upd(L, R, v, id << 1 | 1, mid + 1, r);
}
long long query(int pos, int id = 1, int l = 1, int r = len) {
  if (l == r) return ST[id];
  int mid = (l + r) / 2;
  return min(ST[id], pos <= mid ? query(pos, id << 1, l, mid)
                                : query(pos, id << 1 | 1, mid + 1, r));
}
void dijk(int st, long long d[], int type = 0) {
  fill(d + 1, d + 1 + N, 1e17);
  d[st] = 0;
  pq.push(make_pair(0, st));
  while (pq.size()) {
    long long now;
    int u;
    tie(now, u) = pq.top();
    pq.pop();
    if (d[u] != now) continue;
    for (int i : adj[u]) {
      int v = U[i] + V[i] - u;
      if (d[v] > d[u] + W[i]) {
        tr[v] = i;
        d[v] = d[u] + W[i];
        if (type == 1 && !on[v]) {
          le[v] = le[u];
        } else if (type == 2 && !on[v]) {
          ri[v] = ri[u];
        }
        pq.push(make_pair(d[v], v));
      }
    }
  }
}
void trace(void) {
  on[1] = true;
  le[1] = ri[1] = 0;
  for (int i = 1, cur = 1; cur != N; ++i) {
    int edge = tr[cur];
    ind[edge] = len = i;
    cur = U[edge] + V[edge] - cur;
    on[cur] = true;
    le[cur] = ri[cur] = i;
  }
}
signed main(void) {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  N = hmt();
  M = hmt();
  Q = hmt();
  for (int i = 1; i <= M; ++i) {
    U[i] = hmt();
    V[i] = hmt();
    W[i] = hmt();
    adj[U[i]].emplace_back(i);
    adj[V[i]].emplace_back(i);
    ind[i] = -1;
  }
  dijk(N, dist[1]);
  trace();
  dijk(N, dist[1], 2);
  dijk(1, dist[0], 1);
  fill_n(&ST[0], 4 * maxn, 1e17);
  for (int i = 1; i <= M; ++i) {
    if (ind[i] == -1) {
      upd(le[U[i]] + 1, ri[V[i]], dist[0][U[i]] + W[i] + dist[1][V[i]]);
      upd(le[V[i]] + 1, ri[U[i]], dist[0][V[i]] + W[i] + dist[1][U[i]]);
    }
  }
  for (int i = 1; i <= Q; ++i) {
    int id, val;
    id = hmt();
    val = hmt();
    assert(id <= M);
    long long ans;
    if (ind[id] > 0) {
      ans = dist[0][N] - W[id] + val;
      if (val > W[id]) ans = min(ans, query(ind[id]));
    } else {
      ans = dist[0][N];
      if (val < W[id]) {
        ans = min(ans, dist[0][U[id]] + val + dist[1][V[id]]);
        ans = min(ans, dist[0][V[id]] + val + dist[1][U[id]]);
      }
    }
    cout << ans << '\n';
  }
}
