#include <bits/stdc++.h>
int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }
using namespace ::std;
const long long maxn = 1e5 + 500;
struct M {
  long long lazy;
  long long a, b, ab, bc, abc;
};
M seg[maxn * 8];
M merge(M a, M b) {
  M ans;
  ans.lazy = 0;
  ans.a = max(a.a, b.a);
  ans.b = max(a.b, b.b);
  ans.ab = max(a.a + b.b, max(a.ab, b.ab));
  ans.bc = max(a.b + b.a, max(a.bc, b.bc));
  ans.abc = max(max(a.abc, b.abc), max(a.a + b.bc, a.ab + b.a));
  return ans;
}
void put(long long a, long long v) {
  seg[a].lazy += v;
  seg[a].a += v;
  seg[a].b -= 2 * v;
  seg[a].ab -= v;
  seg[a].bc -= v;
}
void shift(long long a) {
  put(2 * a, seg[a].lazy);
  put(2 * a + 1, seg[a].lazy);
  seg[a].lazy = 0;
}
void update(long long L, long long R, long long node, long long l, long long r,
            long long v) {
  if (l <= L && R <= r) {
    put(node, v);
    return;
  }
  if (r <= L || R <= l) return;
  long long mid = (L + R) / 2;
  shift(node);
  update(L, mid, 2 * node, l, r, v);
  update(mid, R, 2 * node + 1, l, r, v);
  seg[node] = merge(seg[2 * node], seg[2 * node + 1]);
}
vector<long long> ger[maxn];
long long a[maxn];
long long b[maxn];
long long c[maxn];
long long st[maxn];
long long et[maxn];
long long tt = 0;
void dfs(long long v, long long p = -1) {
  tt++;
  for (auto e : ger[v]) {
    long long u = (v ^ a[e] ^ b[e]);
    if (u != p) {
      st[e] = tt;
      dfs(u, v);
      et[e] = tt;
      tt++;
    }
  }
}
void bild(long long n) {
  dfs(1);
  for (long long i = 0; i < n - 1; i++) {
    update(0, tt, 1, st[i], et[i], c[i]);
  }
}
long long update(long long d, long long e) {
  update(0, tt, 1, st[d], et[d], e - c[d]);
  c[d] = e;
  return seg[1].abc;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long n, q, w;
  cin >> n >> q >> w;
  for (long long i = 0; i + 1 < n; i++) {
    cin >> a[i] >> b[i] >> c[i];
    if (a[i] > b[i]) swap(a[i], b[i]);
    ger[a[i]].push_back(i);
    ger[b[i]].push_back(i);
  }
  bild(n);
  long long last = 0;
  for (long long i = 0; i < q; i++) {
    long long d, e;
    cin >> d >> e;
    d = (d + last) % (n - 1);
    e = (e + last) % w;
    last = update(d, e);
    cout << last << endl;
  }
}
