#include<bits/stdc++.h>
#define ll long long
#define ll long long
using namespace std;
const int N=2e5+5;
const ll inf=1e18;
int n,m,q,L[N],R[N],imp[N],tracelen,impid[N];
bool impvis[N];
ll disS[N],disT[N];
bool vis[N];
vector<pair<pair<int,ll>,int> >E[N];
priority_queue<pair<ll,int> >Q;
void dijkstra(int s,ll dis[],int opt=0){
for(int i=1;i<=n;i++){
dis[i]=inf;
vis[i]=0;
}
while(!Q.empty()){
Q.pop();
}
dis[s]=0;
Q.push(make_pair(-dis[s],s));
while(!Q.empty()){
int u=Q.top().second;
Q.pop();
if(vis[u]){
continue;
}
vis[u]=1;
for(int i=0;i<E[u].size();i++){
int v=E[u][i].first.first;ll w=E[u][i].first.second;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
Q.push(make_pair(-dis[v],v));
if(~impid[v]&&opt==1){
L[v]=L[u];
}
if(~impid[v]&&opt==2){
R[v]=R[u];
}
}else if(dis[v]==dis[u]+w){
if(~impid[v]&&opt==1){
L[v]=max(L[v],L[u]);
}
if(~impid[v]&&opt==2){
R[v]=min(R[v],R[u]);
}
}
}
}
}
void getTrace(){
memset(impid,-1,sizeof impid);
int cur=1,cnt=0;
impid[cur]=cnt;
while(cur!=n){
for(int i=0;i<E[cur].size();i++){
int u=cur,v=E[cur][i].first.first,id=E[cur][i].second;ll w=E[cur][i].first.second;
if(disT[u]!=disT[v]+w){
continue;
}
cur=v;
imp[++cnt]=cur;
impid[cur]=cnt;
L[cur]=R[cur]=cnt;
impvis[id]=1;
break;
}
}
tracelen=cnt;
}
namespace SGT{
#define lc tr[i].ch[0]
#define rc tr[i].ch[1]
#define mid (l+r)/2
struct node{
int ch[2];
ll minn,lz;
node(){
minn=lz=inf;
}
}tr[N<<2];
int idx;
void build(int &i,int l,int r){
i=++idx;
if(l==r){
return;
}
build(lc,l,mid);
build(rc,mid+1,r);
}
void lazy(int i,ll val){
tr[i].minn=min(tr[i].minn,val);
tr[i].lz=min(tr[i].lz,val);
}
void pushdown(int i){
lazy(lc,tr[i].lz);
lazy(rc,tr[i].lz);
tr[i].lz=inf;
}
void pushup(int i){
tr[i].minn=min(tr[lc].minn,tr[rc].minn);
}
void modify(int i,int l,int r,int L,int R,ll val){
if(L<=l&&R>=r){
lazy(i,val);
return;
}
pushdown(i);
if(L<=mid){
modify(lc,l,mid,L,R,val);
}
if(R>mid){
modify(rc,mid+1,r,L,R,val);
}
pushup(i);
}
ll query(int i,int l,int r,int x){
if(l==r){
return tr[i].minn;
}
pushdown(i);
if(x<=mid){
return query(lc,l,mid,x);
}else{
return query(rc,mid+1,r,x);
}
}
#undef lc
#undef rc
#undef mid
}
struct edge{
int u,v;ll w;
}e[N];
int rt;
int main(){
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=m;i++){
int u,v;ll w;
scanf("%d%d%lld",&u,&v,&w);
swap(u,v);
E[u].push_back(make_pair(make_pair(v,w),i));
E[v].push_back(make_pair(make_pair(u,w),i));
e[i]=edge{u,v,w};
}
dijkstra(n,disT);
getTrace();
dijkstra(1,disS,1);
dijkstra(n,disT,2);
SGT::build(rt,1,tracelen);
ll sp=disS[n];
for(int u=1;u<=n;u++){
for(int i=0;i<E[u].size();i++){
int v=E[u][i].first.first,id=E[u][i].second;ll w=E[u][i].first.second;
if(impvis[id]){
continue;
}
if(L[u]+1>R[v]){
continue;
}
SGT::modify(rt,1,tracelen,L[u]+1,R[v],disS[u]+disT[v]+w);
}
}
for(int i=1;i<=q;i++){
int pos;ll val;
scanf("%d%lld",&pos,&val);
int u=e[pos].u,v=e[pos].v;ll w=e[pos].w;
ll res=0;
if(impvis[pos]){
if(impid[u]>impid[v]){
swap(u,v);
}
if(val<=w){
res=sp+(val-w);
}else{
res=min(sp+(val-w),SGT::query(rt,1,tracelen,impid[v]));
}
}else{
if(val<=w){
res=min(sp,min(disS[u]+disT[v],disS[v]+disT[u])+val);
}else{
res=sp;
}
}
printf("%lld\n",res);
}
return 0;
}