#include <bits/stdc++.h>
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
struct edge {
  int u, v;
  long long w;
  int idx;
};
int _n, n, m, q;
edge __prev[(int)(2e5)][2];
bool onpath[(int)(2e5)];
pair<int, int> t[(int)(2e5)];
edge edges[(int)(2e5)];
long long dis[(int)(2e5)][2], st[1 << 19];
vector<edge> adj[(int)(2e5)];
void dijsktra(int src, int i) {
  for (int j = 0; j < (n); j++) dis[j][i] = 1e18;
  dis[src][i] = 0;
  priority_queue<pair<long long, int>, vector<pair<long long, int>>,
                 greater<pair<long long, int>>>
      pq;
  pq.push(make_pair(0, src));
  while (!pq.empty()) {
    pair<long long, int> p = pq.top();
    pq.pop();
    int node = p.second;
    if (dis[node][i] < p.first) continue;
    for (const edge e : adj[node])
      if (dis[node][i] + e.w < dis[e.v][i]) {
        dis[e.v][i] = dis[node][i] + e.w;
        __prev[e.v][i] = e;
        pq.push(make_pair(dis[e.v][i], e.v));
      }
  }
}
void floodfill1(int node, int v) {
  t[node].first = v;
  for (const edge e : adj[node])
    if (!onpath[e.idx] && dis[e.v][0] == dis[node][0] + e.w && t[e.v].first > v)
      floodfill1(e.v, v);
}
void floodfill2(int node, int v) {
  t[node].second = v;
  for (const edge e : adj[node])
    if (!onpath[e.idx] && dis[e.v][1] == dis[node][1] + e.w &&
        t[e.v].second < v)
      floodfill2(e.v, v);
}
void markpath() {
  vector<int> path(1, 0);
  for (int i = 0; i < (n); i++) t[i] = {n, 0};
  t[0] = {0, 0};
  int curr = 0;
  while (curr != n - 1) {
    t[__prev[curr][1].u] = {t[curr].first + 1, t[curr].second + 1};
    onpath[__prev[curr][1].idx] = 1;
    curr = __prev[curr][1].u;
    path.push_back(curr);
  }
  for (const int i : path) floodfill1(i, t[i].first);
  reverse((path).begin(), (path).end());
  for (const int i : path) floodfill2(i, t[i].second);
}
void upd(int lo, int hi, long long v) {
  for (lo += _n, hi += _n; lo <= hi; lo >>= 1, hi >>= 1) {
    if (lo % 2 == 1) {
      st[lo] = min(st[lo], v);
      lo++;
    }
    if (hi % 2 == 0) {
      st[hi] = min(st[hi], v);
      hi--;
    }
  }
}
long long qry(int idx) {
  long long res = 1e18;
  for (idx += _n; idx > 0; idx >>= 1) res = min(res, st[idx]);
  return res;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> m >> q;
  for (int i = 0; i < (m); i++) {
    int u, v;
    long long w;
    cin >> u >> v >> w;
    u--, v--;
    adj[u].push_back({u, v, w, i});
    adj[v].push_back({v, u, w, i});
    edges[i] = {u, v, w, i};
  }
  dijsktra(0, 0);
  dijsktra(n - 1, 1);
  markpath();
  _n = 1 << (32 - __builtin_clz(n - 1));
  for (int i = 0; i < (_n << 1); i++) st[i] = 1e18;
  for (int i = 0; i < (n); i++)
    for (const edge e : adj[i])
      if (!onpath[e.idx]) {
        int lo = t[i].first;
        int hi = t[e.v].second - 1;
        long long v = e.w + dis[e.u][0] + dis[e.v][1];
        upd(lo, hi, v);
      }
  for (int i = 0; i < (q); i++) {
    int eidx;
    long long x;
    cin >> eidx >> x;
    eidx--;
    edge e = edges[eidx];
    if (onpath[eidx]) {
      cout << min(x + min(dis[e.u][0] + dis[e.v][1], dis[e.v][0] + dis[e.u][1]),
                  qry(min(t[e.u].first, t[e.v].first)))
           << "\n";
    } else {
      cout << min(dis[n - 1][0],
                  x + min(dis[e.u][0] + dis[e.v][1], dis[e.v][0] + dis[e.u][1]))
           << "\n";
    }
  }
}
