#include <bits/stdc++.h>
using namespace std;
const int N = 230010, P = 998244353;
int n, m, q;
long long dis1[N], dis2[N];
int from[N], frm[N], in[N], L[N], R[N];
struct ei {
  int v, w, id;
  ei(int v = 0, int w = 0, int id = 0) : v(v), w(w), id(id) {}
};
vector<ei> g[N];
int fpw(int a, int b) {
  int res = 1;
  while (b) {
    if (b & 1) res = (long long)res * a % P;
    a = (long long)a * a % P;
    b >>= 1;
  }
  return res;
}
int inv(int x) { return fpw(x, P - 2); }
struct node {
  int u;
  long long d;
  node(int u = 0, long long d = 0) : u(u), d(d) {}
  bool operator<(const node& T) const { return d > T.d; }
};
int route[N], cnt;
void dij(int src, long long* dis, bool f) {
  for (int i = 1; i <= n; ++i) dis[i] = 0x3f3f3f3f3f3f3f3fll;
  dis[src] = 0;
  priority_queue<node> q;
  q.push(node(src, dis[src]));
  while (!q.empty()) {
    int u = q.top().u;
    long long d = q.top().d;
    q.pop();
    if (dis[u] != d) continue;
    for (int i = 0; i < g[u].size(); ++i) {
      int v = g[u][i].v, w = g[u][i].w, id = g[u][i].id;
      if (dis[v] > dis[u] + w) {
        dis[v] = dis[u] + w;
        from[v] = u;
        frm[v] = id;
        q.push(node(v, dis[v]));
      }
    }
  }
  if (f) {
    int cur = n;
    while (cur) {
      route[++cnt] = cur;
      in[frm[cur]] = 1;
      cur = from[cur];
    }
    reverse(route + 1, route + cnt + 1);
    for (int i = 2; i <= cnt; ++i) in[frm[route[i]]] = i - 1;
  }
}
void bfs(int src, long long* dis, int* vis) {
  queue<int> q;
  vis[route[src]] = src;
  q.push(route[src]);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int i = 0; i < g[u].size(); ++i) {
      int v = g[u][i].v, w = g[u][i].w, id = g[u][i].id;
      if (!in[id] && !vis[v] && dis[v] == dis[u] + w) {
        vis[v] = src;
        q.push(v);
      }
    }
  }
}
long long res[N];
struct sgt {
  long long Mn[N << 2];
  sgt() { memset(Mn, 0x3f, sizeof(Mn)); }
  void update(int L, int R, long long v, int p, int l, int r) {
    if (L <= l && r <= R) {
      Mn[p] = min(Mn[p], v);
      return;
    }
    int mid = (l + r) >> 1;
    if (L <= mid) update(L, R, v, p << 1, l, mid);
    if (R > mid) update(L, R, v, p << 1 | 1, mid + 1, r);
  }
  void pushdown(int p, int l, int r) {
    if (l == r) {
      res[l] = Mn[p];
      return;
    }
    Mn[p << 1] = min(Mn[p << 1], Mn[p]);
    Mn[p << 1 | 1] = min(Mn[p << 1 | 1], Mn[p]);
    int mid = (l + r) >> 1;
    pushdown(p << 1, l, mid);
    pushdown(p << 1 | 1, mid + 1, r);
  }
} sgt;
int uu[N], vv[N], ww[N];
int main() {
  scanf("%d%d%d", &n, &m, &q);
  for (int i = 1; i <= m; ++i) {
    int u, v, w;
    scanf("%d%d%d", &u, &v, &w);
    g[u].push_back(ei(v, w, i));
    g[v].push_back(ei(u, w, i));
    uu[i] = u;
    vv[i] = v;
    ww[i] = w;
  }
  dij(1, dis1, 1);
  dij(n, dis2, 0);
  for (int i = 1; i <= cnt; ++i) bfs(i, dis1, L);
  for (int i = cnt; i >= 1; --i) bfs(i, dis2, R);
  for (int u = 1; u <= n; ++u) {
    for (int i = 0; i < g[u].size(); ++i) {
      int v = g[u][i].v, w = g[u][i].w, id = g[u][i].id;
      if (!in[id] && (L[u] && R[v]) && (L[u] <= R[v] - 1))
        sgt.update(L[u], R[v] - 1, dis1[u] + w + dis2[v], 1, 1, cnt - 1);
    }
  }
  sgt.pushdown(1, 1, cnt - 1);
  while (q--) {
    int t, x;
    scanf("%d%d", &t, &x);
    int u = uu[t], v = vv[t];
    if (!in[t]) {
      long long shortest_path =
          min(dis1[n], min(dis1[u] + dis2[v], dis2[u] + dis1[v]) + x);
      printf("%lld\n", shortest_path);
    } else {
      long long shortest_path =
          min(res[in[t]], min(dis1[u] + dis2[v], dis2[u] + dis1[v]) + x);
      printf("%lld\n", shortest_path);
    }
  }
  return 0;
}
