#include <bits/stdc++.h>
using namespace std;
void bmin(long long &a, long long b) { a = (a < b) ? a : b; }
int read() {
  int x = 0, w = 1;
  char ch = getchar();
  while (ch > '9' || ch < '0') {
    if (ch == '-') w = -1;
    ch = getchar();
  }
  while (ch <= '9' && ch >= '0') x = x * 10 + ch - '0', ch = getchar();
  return x * w;
}
const int N = 2e5 + 10;
struct Edge {
  int to, nxt, val;
} e[N << 1];
int n, m, Q, head[N], tot = 1;
int ord[N], len, pre[N], id[N], mrk[N];
long long dis1[N], disn[N], tr[N << 2];
bool vis[N];
vector<int> g[N];
priority_queue<pair<long long, int>, vector<pair<long long, int> >,
               greater<pair<long long, int> > >
    q;
void Adde(int u, int v, int w) {
  e[++tot].to = v;
  e[tot].nxt = head[u];
  head[u] = tot;
  e[tot].val = w;
}
void SPFA(int S) {
  memset(dis1, 63, sizeof(dis1));
  memset(vis, 0, sizeof(vis));
  q.push(make_pair(dis1[S] = 0, S));
  pre[S] = 0;
  while (!q.empty()) {
    int u = q.top().second;
    q.pop();
    if (vis[u]) continue;
    vis[u] = 1;
    for (int i = head[u]; i; i = e[i].nxt) {
      int v = e[i].to, w = e[i].val;
      if (dis1[v] > dis1[u] + w)
        pre[v] = i, q.push(make_pair(dis1[v] = dis1[u] + w, v));
    }
  }
}
void DFS(int u) {
  for (int v : g[u]) {
    if (!id[v]) id[v] = id[u];
    DFS(v);
  }
}
void Modify(int pos, int L, int R, int l, int r, long long val) {
  if (l <= L && R <= r) {
    bmin(tr[pos], val);
    return;
  }
  int mid = (L + R) >> 1;
  if (l <= mid) Modify(pos << 1, L, mid, l, r, val);
  if (r > mid) Modify(pos << 1 | 1, mid + 1, R, l, r, val);
}
long long Query(int pos, int l, int r, int x) {
  if (l == r) return tr[pos];
  int mid = (l + r) >> 1;
  return (x <= mid) ? min(tr[pos], Query(pos << 1, l, mid, x))
                    : min(tr[pos], Query(pos << 1 | 1, mid + 1, r, x));
}
int main() {
  n = read();
  m = read();
  Q = read();
  for (int i = 1, u, v, w; i <= m; i++)
    u = read(), v = read(), w = read(), Adde(u, v, w), Adde(v, u, w);
  SPFA(n);
  memcpy(disn, dis1, sizeof(disn));
  SPFA(1);
  for (int i = n; i > 1; i = e[pre[i] ^ 1].to)
    ord[++len] = i, mrk[pre[i] >> 1] = 1;
  ord[++len] = 1;
  reverse(ord + 1, ord + 1 + len);
  for (int i = 1; i <= len; i++) id[ord[i]] = i;
  for (int i = 2; i <= n; i++)
    if (pre[i]) g[e[pre[i] ^ 1].to].push_back(i);
  DFS(1);
  memset(tr, 63, sizeof(tr));
  for (int p = 1; p <= n; p++)
    for (int i = head[p]; i; i = e[i].nxt) {
      int u = p, v = e[i].to;
      if (id[u] >= id[v] || mrk[i >> 1]) continue;
      Modify(1, 1, len - 1, id[u], id[v] - 1, dis1[u] + e[i].val + disn[v]);
    }
  while (Q--) {
    int x = read() << 1, y = read();
    if (mrk[x >> 1]) {
      if (id[e[x].to] > id[e[x ^ 1].to]) x ^= 1;
      long long t1 = dis1[n] - e[x].val + y;
      long long t2 = Query(1, 1, len - 1, id[e[x].to]);
      printf("%lld\n", min(t1, t2));
    } else {
      long long t1 = dis1[e[x].to] + disn[e[x ^ 1].to];
      long long t2 = dis1[e[x ^ 1].to] + disn[e[x].to];
      printf("%lld\n", min(dis1[n], min(t1, t2) + y));
    }
  }
  return 0;
}
