#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 200005;
struct Edge {
  int u, v, w;
} e[N];
struct EE {
  int v;
  ll w;
  int id;
};
vector<EE> v[N];
int n, m, q, lst[N], l[N], r[N], idx[N], pcnt;
bool on[N];
ll disS[N], disT[N];
void dijkstra(int st, ll dis[], int mode = 0) {
  for (int i = 1; i <= n; i++) dis[i] = LLONG_MAX >> 3;
  dis[st] = 0;
  priority_queue<pair<ll, int>> pq;
  pq.push({0, st});
  while (!pq.empty()) {
    auto nd = pq.top();
    pq.pop();
    int pos = nd.second;
    ll dd = -nd.first;
    if (dd > dis[pos]) continue;
    for (auto &i : v[pos])
      if (dis[i.v] > dd + i.w) {
        lst[i.v] = i.id;
        dis[i.v] = dd + i.w;
        if (mode == 1 && !on[i.v]) l[i.v] = l[pos];
        if (mode == 2 && !on[i.v]) r[i.v] = r[pos];
        pq.push({-dis[i.v], i.v});
      }
  }
}
void get_path() {
  on[1] = 1;
  l[1] = r[1] = 0;
  int cur = 1;
  for (int i = 1; cur != n; i++) {
    int eid = lst[cur];
    idx[eid] = i;
    ++pcnt;
    cur = e[eid].u ^ e[eid].v ^ cur;
    on[cur] = 1;
    l[cur] = r[cur] = i;
  }
}
struct TNode {
  int l, r;
  ll v;
} t[N << 2];
inline int lc(int pos) { return pos << 1; }
inline int rc(int pos) { return pos << 1 | 1; }
void build(int pos, int l, int r) {
  t[pos].v = LLONG_MAX;
  t[pos].l = l;
  t[pos].r = r;
  if (l == r) return;
  int mid = (l + r) >> 1;
  build(lc(pos), l, mid);
  build(rc(pos), mid + 1, r);
}
void modify(int pos, int l, int r, ll v) {
  if (l > r) return;
  if (t[pos].l == l && t[pos].r == r) {
    t[pos].v = min(t[pos].v, v);
    return;
  }
  int mid = (t[pos].l + t[pos].r) >> 1;
  if (r <= mid)
    modify(lc(pos), l, r, v);
  else if (l > mid)
    modify(rc(pos), l, r, v);
  else
    modify(lc(pos), l, mid, v), modify(rc(pos), mid + 1, r, v);
}
ll query(int pos, int p) {
  if (t[pos].l == t[pos].r) return t[pos].v;
  int mid = (t[pos].l + t[pos].r) >> 1;
  if (p <= mid)
    return min(query(lc(pos), p), t[pos].v);
  else
    return min(query(rc(pos), p), t[pos].v);
}
int main() {
  ios::sync_with_stdio(false);
  cin >> n >> m >> q;
  for (int i = 1; i <= m; i++) {
    cin >> e[i].u >> e[i].v >> e[i].w;
    idx[i] = -1;
    v[e[i].u].push_back({e[i].v, e[i].w, i});
    v[e[i].v].push_back({e[i].u, e[i].w, i});
  }
  dijkstra(n, disT);
  get_path();
  dijkstra(1, disS, 1);
  dijkstra(n, disT, 2);
  build(1, 1, pcnt);
  for (int i = 1; i <= m; i++)
    if (idx[i] == -1) {
      modify(1, l[e[i].u] + 1, r[e[i].v], disS[e[i].u] + e[i].w + disT[e[i].v]);
      modify(1, l[e[i].v] + 1, r[e[i].u], disS[e[i].v] + e[i].w + disT[e[i].u]);
    }
  for (int i = 1; i <= q; i++) {
    int eid;
    ll nw, ans = disS[n];
    cin >> eid >> nw;
    if (idx[eid] != -1) {
      ans = disS[n] - e[eid].w + nw;
      if (nw > e[eid].w) ans = min(ans, query(1, idx[eid]));
    } else {
      if (nw < e[eid].w) {
        ans = min(ans, disS[e[eid].u] + nw + disT[e[eid].v]);
        ans = min(ans, disS[e[eid].v] + nw + disT[e[eid].u]);
      }
    }
    cout << ans << endl;
  }
  return 0;
}
