#include <bits/stdc++.h>
using namespace std;
const int maxn = 5e5 + 5;
struct Edge {
  int u, v, w;
} a[maxn];
vector<pair<int, int>> E[maxn];
int rt1, rt2, ma;
pair<int, int> ma1[maxn], ma2[maxn];
void DFS(int u, int pre) {
  ma1[u] = ma2[u] = {0, u};
  for (auto edge : E[u]) {
    int v = edge.first;
    if (v == pre) continue;
    DFS(v, u);
    pair<int, int> t = ma1[v];
    if (t > ma1[u]) swap(t, ma1[u]);
    if (t > ma2[u]) swap(t, ma2[u]);
  }
  if (ma1[u].first + ma2[u].first > ma) {
    ma = ma1[u].first + ma2[u].first;
    rt1 = ma1[u].second;
    rt2 = ma2[u].second;
  }
  ma1[u].first++;
  ma2[u].first++;
}
struct Tree {
  int c[maxn << 2][2];
  int lazy[maxn << 2], in[maxn], out[maxn];
  int rank[maxn], dep[maxn], col[maxn], tot;
  void pushdown(int rt) {
    if (!lazy[rt]) return;
    swap(c[rt << 1][0], c[rt << 1][1]);
    swap(c[rt << 1 | 1][0], c[rt << 1 | 1][1]);
    lazy[rt << 1] ^= 1;
    lazy[rt << 1 | 1] ^= 1;
    lazy[rt] = 0;
  }
  void pushup(int rt) {
    c[rt][0] = max(c[rt << 1][0], c[rt << 1 | 1][0]);
    c[rt][1] = max(c[rt << 1][1], c[rt << 1 | 1][1]);
  }
  void build(int rt, int l, int r) {
    c[rt][0] = c[rt][1] = lazy[rt] = 0;
    if (l == r) {
      c[rt][col[rank[l]]] = dep[rank[l]];
      return;
    }
    int mid = (l + r) >> 1;
    build(rt << 1, l, mid);
    build(rt << 1 | 1, mid + 1, r);
    pushup(rt);
  }
  void update(int rt, int l, int r, int ql, int qr) {
    if (l == ql && r == qr) {
      swap(c[rt][0], c[rt][1]);
      lazy[rt] ^= 1;
      return;
    }
    pushdown(rt);
    int mid = (l + r) >> 1;
    if (mid >= qr)
      update(rt << 1, l, mid, ql, qr);
    else if (mid + 1 <= ql)
      update(rt << 1 | 1, mid + 1, r, ql, qr);
    else
      update(rt << 1, l, mid, ql, mid),
          update(rt << 1 | 1, mid + 1, r, mid + 1, qr);
    pushup(rt);
  }
  void dfs(int u, int pre) {
    in[u] = ++tot;
    rank[tot] = u;
    dep[u] = dep[pre] + 1;
    for (auto edge : E[u]) {
      int v = edge.first, w = edge.second;
      if (v == pre) continue;
      col[v] = col[u] ^ w;
      dfs(v, u);
    }
    out[u] = tot;
  }
} T[2];
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n;
  cin >> n;
  for (int i = 1; i < n; i++) {
    int x, y, z;
    cin >> x >> y >> z;
    a[i] = Edge{x, y, z};
    E[x].emplace_back(y, z);
    E[y].emplace_back(x, z);
  }
  DFS(1, 0);
  T[0].dfs(rt1, 0);
  T[0].build(1, 1, n);
  T[1].dfs(rt2, 0);
  T[1].build(1, 1, n);
  int Q;
  cin >> Q;
  while (Q--) {
    int x;
    cin >> x;
    int y = a[x].u;
    if (T[0].dep[a[x].u] < T[0].dep[a[x].v]) y = a[x].v;
    T[0].update(1, 1, n, T[0].in[y], T[0].out[y]);
    y = a[x].u;
    if (T[1].dep[a[x].u] < T[1].dep[a[x].v]) y = a[x].v;
    T[1].update(1, 1, n, T[1].in[y], T[1].out[y]);
    int ans = max(T[0].c[1][0], T[1].c[1][0]) - 1;
    cout << ans << '\n';
  }
  return 0;
}
