#include <bits/stdc++.h>
const long long INF = 1e18;
template <typename T>
void read(T& x) {
  x = 0;
  int ch = getchar();
  for (; !isdigit(ch); ch = getchar()) {
  };
  for (; isdigit(ch); ch = getchar()) {
    x = x * 10 + ch - '0';
  }
}
struct oriEdge {
  int u, v;
  long long w;
} oE[600005];
struct edge {
  int v, next;
  long long w;
} e[600005];
int hd[600005], cntE, idE[600005];
struct segTr {
  int l, r;
  long long min, tagC;
} tr[600005 << 3];
long long disE[600005], disR[600005];
int pL[600005], pR[600005];
int disFrom[600005];
int cntP;
bool onMinP[600005];
int ind[600005 << 1];
bool vis[600005];
inline void AddE(int u, int v, long long w);
inline void Dij(int s, long long* dis, int opt);
inline void Trace(int to);
void Build(int now, int l, int r);
void PushDown(int now);
void Update(int now, int l, int r, long long val);
long long Query(int now, int pos);
int n;
int main() {
  int m, q;
  read<int>(n), read<int>(m), read<int>(q);
  long long w;
  for (int i = 1, u, v; i <= m; i++) {
    read<int>(u), read<int>(v), read<long long>(w);
    oE[i] = (oriEdge){u, v, w};
    AddE(u, v, w);
    idE[cntE] = i;
    AddE(v, u, w);
    idE[cntE] = i;
    ind[i] = -1;
  }
  Dij(n, disR, 0);
  Trace(n);
  Dij(1, disE, 1);
  Dij(n, disR, 2);
  Build(1, 1, cntP);
  for (int i = 1; i <= m; i++) {
    if (!(~ind[i])) {
      Update(1, pL[oE[i].u] + 1, pR[oE[i].v],
             disE[oE[i].u] + oE[i].w + disR[oE[i].v]);
      Update(1, pL[oE[i].v] + 1, pR[oE[i].u],
             disE[oE[i].v] + oE[i].w + disR[oE[i].u]);
    }
  }
  long long ans, x;
  for (int t; q; q--) {
    ans = disE[n];
    read<int>(t), read<long long>(x);
    if (~ind[t]) {
      ans = disE[n] - oE[t].w + x;
      if (x > oE[t].w) {
        ans = std::min(ans, Query(1, ind[t]));
      }
    } else {
      if (x < oE[t].w) {
        ans = std::min(ans, disE[oE[t].u] + x + disR[oE[t].v]);
        ans = std::min(ans, disE[oE[t].v] + x + disR[oE[t].u]);
      }
    }
    printf("%lld\n", ans);
  }
  return 0;
}
long long Query(int now, int pos) {
  if (tr[now].l == pos && pos == tr[now].r) {
    return tr[now].min;
  }
  int mid = (tr[now].l + tr[now].r) >> 1;
  long long ans = tr[now].min;
  if (pos <= mid) {
    ans = std::min(ans, Query(now << 1, pos));
  } else {
    ans = std::min(ans, Query(now << 1 | 1, pos));
  }
  return ans;
}
void Update(int now, int l, int r, long long val) {
  if (l <= tr[now].l && tr[now].r <= r) {
    tr[now].min = std::min(tr[now].min, val);
    return;
  }
  int mid = (tr[now].l + tr[now].r) >> 1;
  if (l <= mid) {
    Update(now << 1, l, r, val);
  }
  if (r > mid) {
    Update(now << 1 | 1, l, r, val);
  }
}
void PushDown(int now) {
  if (~tr[now].tagC) {
    if (~tr[now << 1].tagC) {
      tr[now << 1].tagC = std::min(tr[now << 1].tagC, tr[now].tagC);
    } else {
      tr[now << 1].tagC = tr[now].tagC;
    }
    if (~tr[now << 1 | 1].tagC) {
      tr[now << 1 | 1].tagC = std::min(tr[now << 1 | 1].tagC, tr[now].tagC);
    } else {
      tr[now << 1 | 1].tagC = tr[now].tagC;
    }
    tr[now << 1].min = std::min(tr[now << 1].min, tr[now].tagC);
    tr[now << 1 | 1].min = std::min(tr[now << 1 | 1].min, tr[now].tagC);
    tr[now].tagC = -1;
  }
}
void Build(int now, int l, int r) {
  tr[now] = (segTr){l, r, INF, -1};
  if (l == r) {
    return;
  }
  int mid = (l + r) >> 1;
  Build(now << 1, l, mid);
  Build(now << 1 | 1, mid + 1, r);
}
inline void Trace(int to) {
  onMinP[1] = true;
  pL[1] = pR[1] = 0;
  for (int i = 1, now = 1; now != to; i++) {
    ind[disFrom[now]] = i;
    cntP++;
    now = oE[disFrom[now]].u ^ oE[disFrom[now]].v ^ now;
    onMinP[now] = true;
    pL[now] = pR[now] = i;
  }
}
std::priority_queue<std::pair<long long, int>,
                    std::vector<std::pair<long long, int> >,
                    std::greater<std::pair<long long, int> > >
    H;
inline void Dij(int s, long long* dis, int opt) {
  for (int i = 1; i <= n; i++) {
    dis[i] = INF;
    vis[i] = false;
  }
  dis[s] = 0;
  H.push(std::make_pair(dis[s], s));
  while (H.size()) {
    int now = H.top().second;
    H.pop();
    if (!vis[now]) {
      vis[now] = true;
      for (int i = hd[now]; i; i = e[i].next) {
        if (dis[e[i].v] > dis[now] + e[i].w) {
          disFrom[e[i].v] = idE[i];
          dis[e[i].v] = dis[now] + e[i].w;
          if (opt == 1 && (!onMinP[e[i].v])) {
            pL[e[i].v] = pL[now];
          }
          if (opt == 2 && (!onMinP[e[i].v])) {
            pR[e[i].v] = pR[now];
          }
          H.push(std::make_pair(dis[e[i].v], e[i].v));
        }
      }
    }
  }
}
inline void AddE(int u, int v, long long w) {
  e[++cntE] = (edge){v, hd[u], w};
  hd[u] = cntE;
}
