#include <bits/stdc++.h>
using namespace std;
long long n,q,w;
vector<pair<long long,long long> > v[200001];
pair<long long,long long> a[200001];
long long h[200001];
void read()
{
cin>>n>>q>>w;
for(long long i=1;i<n;i++)
{
long long x,y,d;
cin>>x>>y>>d;
a[i]={x,y};
h[i]=d;
v[x].push_back({y,d});
v[y].push_back({x,d});
}
}
long long in[200001],out[200001];
long long d[200001];
vector<long long> e;
long long num;
void dfs(long long i,long long p)
{
in[i]=num++;
e.push_back(i);
for(long long j=0;j<v[i].size();j++)
{
pair<long long,long long> nb=v[i][j];
if(nb.first==p)continue;
d[nb.first]=d[i]+nb.second;
dfs(nb.first,i);
e.push_back(i);
num++;
}
out[i]=num-1;
}
struct node
{
long long i,j,k;
long long ik,jk;
long long ijk;
node(){}
node(long long di,long long dj,long long dk,long long dik,long long djk,long long dijk)
{
i=di;
j=dj;
k=dk;
ik=dik;
jk=djk;
ijk=dijk;
}
};
node t[800001];
node merge_(node l,node r)
{
node ans={-(long long)1e18,-(long long)1e18,-(long long)1e18,-(long long)1e18,-(long long)1e18,-(long long)1e18};
ans.i=max(l.i,r.i);
ans.j=max(l.j,r.j);
ans.k=max(l.k,r.k);
ans.ik=max(l.ik,r.ik);
ans.jk=max(l.jk,r.jk);
ans.ik=max(ans.ik,l.i+r.k);
ans.jk=max(ans.jk,l.k+r.j);
ans.ijk=max(l.ijk,r.ijk);
ans.ijk=max(ans.ijk,l.ik+r.j);
ans.ijk=max(ans.ijk,l.i+r.jk);
return ans;
}
void build(long long i,long long l,long long r)
{
if(l==r)
{
long long f=e[l];
t[i]={d[f],d[f],-2*d[f],-(long long)1e18,-(long long)1e18,-(long long)1e18};
return;
}
long long m=(l+r)/2;
build(i*2,l,m);
build(i*2+1,m+1,r);
t[i]=merge_(t[i*2],t[i*2+1]);
//cout<<l<<"-"<<r<<" : "<<t[i].i<<" "<<t[i].k<<" "<<t[i].j<<" "<<t[i].ik<<" "<<t[i].jk<<" "<<t[i].ijk<<endl;
}
long long lz[800001];
void push(long long i,long long l,long long r)
{
long long f=lz[i];
t[i].i-=f;
t[i].j-=f;
t[i].k+=2*f;
t[i].ik+=f;
t[i].jk+=f;
if(l!=r)
{
lz[i*2]+=lz[i];
lz[i*2+1]+=lz[i];
}
lz[i]=0;
}
void update(long long i,long long l,long long r,long long ql,long long qr,long long vl)
{
push(i,l,r);
if(ql>qr)return;
if(ql<=l&&r<=qr)
{
lz[i]+=vl;
push(i,l,r);
return;
}
long long m=(l+r)/2;
update(i*2,l,m,ql,min(m,qr),vl);
update(i*2+1,m+1,r,max(m+1,ql),qr,vl);
t[i]=merge_(t[i*2],t[i*2+1]);
}
void solve()
{
long long sz=e.size()-1;
build(1,0,sz);
long long last=0;
for(long long i=1;i<=q;i++)
{
long long x,y;
cin>>x>>y;
x=(x+last)%(n-1);
y=(y+last)%w;
long long v1=a[x+1].first;
long long v2=a[x+1].second;
if(d[v1]>d[v2])swap(v1,v2);
//cout<<"- "<<in[v2]<<" "<<out[v2]<<" "<<-h[x+1]+y<<endl;
update(1,0,sz,in[v2],out[v2],+h[x+1]-y);
h[x+1]=y;
if(n==2)cout<<y<<endl;
else cout<<t[1].ijk<<endl;
if(n==2)last=y;
else last=t[1].ijk;
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
read();
long long s=1;
for(long long i=1;i<=n;i++)
if(v[i].size()>1)s=i;
dfs(s,0);
solve();
return 0;
}
/*
10 10 10000
1 9 1241
5 6 1630
10 5 1630
2 6 853
10 1 511
5 3 760
8 3 1076
4 10 1483
7 10 40
8 2051
5 6294
5 4168
7 1861
0 5244
6 5156
3 3001
8 5267
5 3102
8 3623
4 3 2000
1 2 100
2 3 1000
2 4 1000
2 1030
1 1020
1 890
*/