#include <bits/stdc++.h>
#define int long long
#define endl '\n';
using namespace std;
typedef pair<int, int> pii;
struct BIT{
int n;
vector<int> tree;
BIT(int n = 0){
this->n = n + 1;
this->tree.assign(n + 5, 0);
}
void update(int idx, int val){
for(; idx<=n; idx+=-idx&idx) tree[idx] += val;
}
void update(int l, int r, int val){
update(l, val);
update(r + 1, -val);
}
int get(int idx){
int res = 0;
for(; idx; idx-=-idx&idx) res += tree[idx];
return res;
}
};
struct SMT{
int n;
vector<int> tree;
SMT(int n = 0){
this->n = n;
this->tree.assign(n<<2|3, 0);
}
void update(int pos, int val){
int id = 1;
for(int lo=1, hi=n; lo<hi;){
int mid = (lo + hi)>>1;
if(pos <= mid) hi = mid, id = id<<1;
else lo = mid + 1, id = id<<1|1;
}
tree[id] = val;
for(id>>=1; id; id>>=1) tree[id] = max(tree[id<<1], tree[id<<1|1]);
}
int get(int pos){
int res = 0;
for(int lo=1, hi=n, id=1; lo<hi;){
int mid = (lo + hi)>>1;
if(pos <= mid) hi = mid, id = id<<1;
else{
res = max(res, tree[id<<1]);
lo = mid + 1;
id = id<<1|1;
}
}
return res;
}
int rget(int pos){
int res = 0;
for(int lo=1, hi=n, id=1; lo<hi;){
int mid = (lo + hi)>>1;
if(pos > mid) lo = mid + 1, id = id<<1|1;
else{
res = max(res, tree[id<<1|1]);
hi = mid;
id = id<<1;
}
}
return res;
}
int get(int l, int r){
return max(get(l), rget(r));
}
};
const int MX = 100005;
int n, q, W;
int e[MX];
int c[MX];
pii edges[MX];
vector<int> G[MX];
void nhap(){
cin >> n >> q >> W;
for(int i=1; i<n; i++){
int u, v;
cin >> u >> v >> c[i];
e[i] = u ^ v;
edges[i] = {u, v};
G[u].push_back(i);
G[v].push_back(i);
}
}
namespace HLD{
int p[MX];
int h[MX];
int numC[MX];
int heavy[MX];
BIT bit(MX);
int dfsID = 0;
int num[MX];
int clo[MX];
int head[MX];
void dfs(int u){
h[u] = h[p[u]] + 1;
numC[u] = 1;
for(int i: G[u]){
int v = e[i] ^ v;
if(v != p[u]){
h[v] = u;
dfs(v);
numC[u] += numC[v];
if(numC[heavy[u]] < numC[v]) heavy[u] = v;
}
}
}
void decompose(int u, int he){
num[u] = ++dfsID;
head[u] = he;
if(heavy[u]) decompose(heavy[u], he);
for(int i: G[u]){
int v = e[i] ^ u;
if(v != p[u] && v != heavy[u]) decompose(v, v);
}
clo[u] = dfsID;
}
int LCA(int u, int v){
while(head[u] != head[v]){
if(h[head[u]] < h[head[v]]) swap(u, v);
u = p[head[u]];
}
return h[u] < h[v]? u : v;
}
void build(){
dfs(1);
decompose(1, 1);
for(int i=1; i<n; i++){
int u, v;
tie(u, v) = edges[i];
if(h[u] > h[v]) swap(u, v);
bit.update(num[v], clo[v], c[i]);
}
}
void update(int i, int x){
int u, v;
tie(u, v) = edges[i];
if(h[u] > h[v]) swap(u, v);
bit.update(num[v], clo[v], x - c[i]);
c[i] = x;
}
int get(int u, int v){
int puv = LCA(u, v);
return bit.get(u) + bit.get(v) - 2*bit.get(puv);
}
}
namespace CENTROID{
int h[MX];
int num[]
int pp[MX];
int head[MX];
int numC[MX];
SMT smt[MX];
vector<int> T[MX];
multiset<int> mxdi[MX];
multiset<int> lowd[MX];
bitset<MX> used = 0;
void calChild(int u, int p){
h[u] = h[p] + 1;
numC[u] = 0;
for(int i: G[u]){
int v = e[i] ^ u;
if(v != p && !used[v]) calChild(v, u);
numC[u] += numC[v];
}
}
int Centroid(int u, int p, const int &half){
for(int i: G[u]){
int v = u ^ e[i];
if(v != p && !used[v] && numC[v] > half) return Centroid(v, u, half);
}
return u;
}
void decompose(int u, int p){
calChild(u, 0);
int sz = numC[u];
u = Centroid(u, 0, numC[u] >> 1);
head[u] = p;
h[u] = h[head[u]] + 1;
smt[u] = SMT(sz);
used[u] = 1;
for(int i: G[u]){
int v = e[u] ^ u;
if(!used[v]) decompose(v, u);
}
}
void build(){
decompose(1, 0);
}
}
void solve(){
HLD::build();
CENTROID::build();
int last = 0;
while(q--){
int d, e;
cin >> d >> e;
d = (d + last) % (n - 1) + 1;
e = (e + W) % last;
cout << last << endl;
}
}
int32_t main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
nhap();
solve();
return 0;
}