#include <bits/stdc++.h>
using namespace std;
int x[200005], y[200005], z[200005], target[400005], pre[400005], last[200005],
    tot, w[400005], n, deep[200005], f[200005][18], id[200005];
long long dis[2][200005], tree[800005];
bool visited[200005], type[200005];
vector<int> to[200005], v;
set<pair<int, int> > se;
void add(int x, int y, int z) {
  target[++tot] = y;
  pre[tot] = last[x];
  last[x] = tot;
  w[tot] = z;
}
priority_queue<pair<long long, int>, vector<pair<long long, int> >,
               greater<pair<long long, int> > >
    q;
void dij(int s, long long *dis) {
  for (int i = 1; i <= n; i++) dis[i] = 1e18, visited[i] = 0;
  dis[s] = 0;
  q.push(make_pair(0, s));
  while (q.size()) {
    while (q.size() && visited[q.top().second]) q.pop();
    if (!q.size()) break;
    int now = q.top().second;
    q.pop();
    visited[now] = 1;
    for (int i = last[now]; i; i = pre[i]) {
      int tar = target[i];
      if (dis[tar] > dis[now] + w[i])
        dis[tar] = dis[now] + w[i], q.push(make_pair(dis[tar], tar));
    }
  }
}
void dfs(int x) {
  for (auto tar : to[x]) deep[tar] = deep[x] + 1, f[tar][0] = x, dfs(tar);
}
int lca(int x, int y) {
  if (deep[x] < deep[y]) swap(x, y);
  for (int k = 17; k >= 0; k--)
    if (deep[f[x][k]] >= deep[y]) x = f[x][k];
  if (x == y) return x;
  for (int k = 17; k >= 0; k--)
    if (f[x][k] != f[y][k]) x = f[x][k], y = f[y][k];
  return f[x][0];
}
bool getchain(int x) {
  if (x == n) {
    v.push_back(x);
    return 1;
  }
  for (auto tar : to[x])
    if (getchain(tar)) {
      v.push_back(x);
      return 1;
    }
  return 0;
}
void modify(int l, int r, int x, int a, int b, long long c) {
  if (l >= a && r <= b) {
    tree[x] = min(tree[x], c);
    return;
  }
  int mid = (l + r) >> 1;
  if (a <= mid) modify(l, mid, x * 2, a, b, c);
  if (b > mid) modify(mid + 1, r, x * 2 + 1, a, b, c);
}
long long query(int l, int r, int x, int a) {
  if (l == r) return tree[x];
  int mid = (l + r) >> 1;
  if (a <= mid) return min(tree[x], query(l, mid, x * 2, a));
  return min(tree[x], query(mid + 1, r, x * 2 + 1, a));
}
int main() {
  int m, q, a, b;
  scanf("%d%d%d", &n, &m, &q);
  for (int i = 1; i <= m; i++)
    scanf("%d%d%d", &x[i], &y[i], &z[i]), add(x[i], y[i], z[i]),
        add(y[i], x[i], z[i]);
  dij(1, dis[1]), dij(n, dis[0]);
  for (int i = 1; i <= m; i++) {
    if (dis[1][x[i]] + z[i] == dis[1][y[i]]) to[x[i]].push_back(y[i]);
    if (dis[1][y[i]] + z[i] == dis[1][x[i]]) to[y[i]].push_back(x[i]);
  }
  for (int i = 1; i <= n; i++)
    sort(to[i].begin(), to[i].end()),
        to[i].erase(unique(to[i].begin(), to[i].end()), to[i].end());
  deep[1] = 1;
  dfs(1);
  for (int k = 1; k <= 17; k++)
    for (int i = 1; i <= n; i++) f[i][k] = f[f[i][k - 1]][k - 1];
  getchain(1);
  for (int i = 0; i < v.size(); i++) id[v[i]] = i + 1;
  int t = v.size();
  memset(tree, 0x1f, sizeof(tree));
  for (int i = 1; i <= m; i++) {
    if (deep[x[i]] < deep[y[i]]) swap(x[i], y[i]);
    if (deep[x[i]] == deep[y[i]] + 1 && id[x[i]] && id[y[i]] &&
        z[i] == dis[1][x[i]] - dis[1][y[i]])
      if (se.find(make_pair(x[i], y[i])) == se.end()) {
        type[i] = 1;
        se.insert(make_pair(x[i], y[i]));
        continue;
      }
    int fx = lca(x[i], n), fy = lca(y[i], n);
    if (id[fx] == id[fy]) continue;
    if (id[fx] > id[fy]) swap(fx, fy), swap(x[i], y[i]);
    modify(1, t, 1, id[fx], id[fy] - 1, dis[0][x[i]] + z[i] + dis[1][y[i]]);
  }
  for (int c = 1; c <= q; c++) {
    scanf("%d%d", &a, &b);
    if (x[a] == y[a])
      printf("%lld\n", dis[1][n]);
    else if (!type[a]) {
      if (b >= z[a])
        printf("%lld\n", dis[1][n]);
      else
        printf("%lld\n", min(dis[1][n], min(dis[0][x[a]] + b + dis[1][y[a]],
                                            dis[1][x[a]] + b + dis[0][y[a]])));
    } else {
      if (b <= z[a])
        printf("%lld\n", dis[1][n] - z[a] + b);
      else
        printf("%lld\n", min(dis[1][n] - z[a] + b, query(1, t, 1, id[x[a]])));
    }
  }
  return 0;
}
