#include <bits/stdc++.h>
using namespace std;
const int maxn = 212345;
const long long inf = 0x3f3f3f3f3f3f3f3f;
struct Edge {
  int u, v, w;
} e[maxn];
struct Seg {
  int l, r;
  long long val;
} T[maxn << 2];
int n, m, q, sz;
vector<int> G[maxn];
int pre[maxn], idx[maxn], lo[maxn], hi[maxn];
bool vis[maxn];
long long dis[maxn][2];
void build(int o, int l, int r) {
  T[o].l = l, T[o].r = r;
  T[o].val = inf;
  if (l < r) {
    int mi = l + r >> 1;
    build(o << 1, l, mi);
    build(o << 1 | 1, mi + 1, r);
  }
}
void upd(int o, int l, int r, long long val) {
  if (r < l) return;
  if (l <= T[o].l && T[o].r <= r) {
    T[o].val = min(T[o].val, val);
    return;
  }
  int mi = T[o].l + T[o].r >> 1;
  if (l <= mi) upd(o << 1, l, r, val);
  if (r > mi) upd(o << 1 | 1, l, r, val);
}
long long query(int o, int x) {
  if (T[o].l == T[o].r) return T[o].val;
  int mi = T[o].l + T[o].r >> 1;
  return min(T[o].val, query(o << 1 | (x > mi), x));
}
int main() {
  scanf("%d%d%d", &n, &m, &q);
  for (int(i) = (1); (i) <= (m); (i)++) {
    scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].w);
    G[e[i].u].emplace_back(i);
    G[e[i].v].emplace_back(i);
  }
  for (int(i) = (1); (i) <= (n - 1); (i)++) dis[i][0] = inf;
  set<pair<long long, int>> que;
  que.emplace(0, n);
  while (!que.empty()) {
    auto now = *que.begin();
    que.erase(now);
    int u = now.second;
    long long d = now.first;
    if (dis[u][0] < d) continue;
    for (auto i : G[u]) {
      int v = e[i].u == u ? e[i].v : e[i].u, w = e[i].w;
      if (dis[v][0] > d + w) {
        dis[v][0] = d + w;
        pre[v] = i;
        que.emplace(dis[v][0], v);
      }
    }
  }
  for (int u = 1; u;) {
    vis[u] = true;
    const Edge &now = e[pre[u]];
    lo[u] = sz;
    if (now.w) idx[pre[u]] = ++sz;
    hi[u] = sz;
    u = now.u == u ? now.v : now.u;
  }
  hi[n]++;
  memset(dis, 0x3f, sizeof(dis));
  que.emplace(0, 1);
  dis[1][0] = 0;
  while (!que.empty()) {
    auto now = *que.begin();
    que.erase(now);
    int u = now.second;
    long long d = now.first;
    if (dis[u][0] < d) continue;
    for (auto i : G[u]) {
      int v = e[i].u == u ? e[i].v : e[i].u, w = e[i].w;
      if (dis[v][0] > d + w) {
        dis[v][0] = d + w;
        pre[v] = i;
        if (!vis[v]) lo[v] = lo[u];
        que.emplace(dis[v][0], v);
      }
    }
  }
  dis[n][1] = 0;
  que.emplace(0, n);
  while (!que.empty()) {
    auto now = *que.begin();
    que.erase(now);
    int u = now.second;
    long long d = now.first;
    if (dis[u][1] < d) continue;
    for (auto i : G[u]) {
      int v = e[i].u == u ? e[i].v : e[i].u, w = e[i].w;
      if (dis[v][1] > d + w) {
        dis[v][1] = d + w;
        pre[v] = i;
        if (!vis[v]) hi[v] = hi[u];
        que.emplace(dis[v][1], v);
      }
    }
  }
  build(1, 1, sz);
  for (int(i) = (1); (i) <= (m); (i)++)
    if (!idx[i]) {
      upd(1, lo[e[i].u] + 1, hi[e[i].v] - 1,
          dis[e[i].u][0] + dis[e[i].v][1] + e[i].w);
      upd(1, lo[e[i].v] + 1, hi[e[i].u] - 1,
          dis[e[i].v][0] + dis[e[i].u][1] + e[i].w);
    }
  while (q--) {
    int t, x;
    scanf("%d%d", &t, &x);
    long long ans = inf;
    if (idx[t]) {
      ans = min(ans, dis[n][0] - e[t].w + x);
      if (x > e[t].w) ans = min(ans, query(1, idx[t]));
    } else {
      ans = dis[n][0];
      ans = min(ans, dis[e[t].u][0] + dis[e[t].v][1] + x);
      ans = min(ans, dis[e[t].v][0] + dis[e[t].u][1] + x);
    }
    printf("%lld\n", ans);
  }
}
