#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 5;
const int MAXM = 2e5 + 5;
struct seg_node {
  int L, R;
  long long val;
} Tree[MAXN << 2];
void build(int rt, int L, int R) {
  Tree[rt].L = L;
  Tree[rt].R = R;
  Tree[rt].val = 0x3f3f3f3f3f3f3f3f;
  if (L == R) return;
  build(rt << 1, L, (Tree[rt].L + Tree[rt].R) / 2);
  build(rt << 1 | 1, (Tree[rt].L + Tree[rt].R) / 2 + 1, R);
}
void update(int rt, int L, int R, long long x) {
  if (L <= Tree[rt].L && Tree[rt].R <= R) {
    Tree[rt].val = min(Tree[rt].val, x);
    return;
  }
  if (L <= (Tree[rt].L + Tree[rt].R) / 2) update(rt << 1, L, R, x);
  if ((Tree[rt].L + Tree[rt].R) / 2 + 1 <= R) update(rt << 1 | 1, L, R, x);
}
long long query(int rt, int p) {
  if (Tree[rt].L == Tree[rt].R) return Tree[rt].val;
  long long ans = Tree[rt].val;
  if (p <= (Tree[rt].L + Tree[rt].R) / 2)
    ans = min(ans, query(rt << 1, p));
  else
    ans = min(ans, query(rt << 1 | 1, p));
  return ans;
}
struct edge {
  int from, to, next, w;
} e[MAXM * 2];
int cnt = 1;
int head[MAXN];
void add_edge(int u, int v, int w = 0) {
  e[++cnt].to = v;
  e[cnt].next = head[u];
  e[cnt].w = w;
  e[cnt].from = u;
  head[u] = cnt;
}
int L[MAXN];
int R[MAXN];
int pos[MAXN];
int on_path[MAXM];
long long ds[MAXN];
long long dt[MAXN];
int pre[MAXN];
int vis[MAXN];
priority_queue<pair<long long, int>, vector<pair<long long, int> >,
               greater<pair<long long, int> > >
    q;
void dijkstra(int n, int s, long long dis[], int f = 0) {
  for (int i = 1; i <= n; i++) {
    dis[i] = 0x3f3f3f3f3f3f3f3f;
    vis[i] = pre[i] = 0;
  }
  dis[s] = 0;
  q.push({0, s});
  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].next) {
      int v = e[i].to, w = e[i].w;
      if (dis[u] + w < dis[v]) {
        dis[v] = dis[u] + w;
        q.push({dis[v], v});
        pre[v] = i;
        if (f == 1 && pos[v] == 0) L[v] = L[u];
        if (f == 2 && pos[v] == 0) R[v] = R[u];
      }
    }
  }
}
int main() {
  int n, m, q;
  scanf("%d%d%d", &n, &m, &q);
  for (int i = 0; i < m; i++) {
    int u, v, w;
    scanf("%d%d%d", &u, &v, &w);
    add_edge(u, v, w);
    add_edge(v, u, w);
  }
  dijkstra(n, n, dt);
  int len = 0;
  for (int u = 1; u; u = e[pre[u]].from) {
    pos[u] = ++len;
    on_path[pre[u] / 2] = 1;
    L[u] = R[u] = len;
  }
  dijkstra(n, 1, ds, 1);
  dijkstra(n, n, dt, 2);
  build(1, 1, len);
  for (int i = 2; i <= m * 2 + 1; i += 2) {
    if (on_path[i / 2]) continue;
    int u = e[i].from, v = e[i].to, w = e[i].w;
    if (L[u] <= R[v] - 1) update(1, L[u], R[v] - 1, ds[u] + w + dt[v]);
    if (L[v] <= R[u] - 1) update(1, L[v], R[u] - 1, ds[v] + w + dt[u]);
  }
  while (q--) {
    int id, x;
    scanf("%d%d", &id, &x);
    int u = e[id * 2].from, v = e[id * 2].to, w = e[id * 2].w;
    if (on_path[id]) {
      long long ans = ds[n] - w + x;
      if (x > w) {
        int p1 = pos[u];
        int p2 = pos[v];
        ans = min(ans, query(1, min(p1, p2)));
      }
      printf("%lld\n", ans);
    } else {
      long long ans = ds[n];
      if (x < w) {
        ans = min(ans, ds[u] + x + dt[v]);
        ans = min(ans, ds[v] + x + dt[u]);
      }
      printf("%lld\n", ans);
    }
  }
}
