#include <bits/stdc++.h>
const int maxn = 5e5 + 5;
using namespace std;
int rd() {
  int x = 0, f = 1;
  char c = getchar();
  while (!isdigit(c)) {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (isdigit(c)) x = (x << 3) + (x << 1) + c - '0', c = getchar();
  return x * f;
}
int n, m, head[maxn], tot, rt, rt1, dep[maxn];
struct node {
  int v, nxt, w, id;
} e[maxn << 1];
void add(int u, int v, int w, int id) {
  e[++tot] = node{v, head[u], w, id};
  head[u] = tot;
}
struct Segmemt_tree {
  int mx_0[maxn << 2], mx_1[maxn << 2], in[maxn], out[maxn], cnt,
      rev[maxn << 2], to[maxn];
  void pushup(int p) {
    mx_0[p] = max(mx_0[(p << 1)], mx_0[(p << 1 | 1)]);
    mx_1[p] = max(mx_1[(p << 1)], mx_1[(p << 1 | 1)]);
  }
  void update(int p) {
    swap(mx_0[p], mx_1[p]);
    rev[p] ^= 1;
  }
  void pushdown(int p) {
    if (!rev[p]) return;
    update((p << 1));
    update((p << 1 | 1));
    rev[p] ^= 1;
  }
  void modify(int p, int l, int r, int x, int v, int v1) {
    if (l == r) {
      mx_0[p] = max(mx_0[p], v);
      mx_1[p] = max(mx_1[p], v1);
      return;
    }
    int mid = (l + r) >> 1;
    pushdown(p);
    if (x <= mid)
      modify((p << 1), l, mid, x, v, v1);
    else
      modify((p << 1 | 1), mid + 1, r, x, v, v1);
    pushup(p);
  }
  int query_0(int p, int l, int r, int x) {
    if (l == r) return mx_0[p];
    int mid = (l + r) >> 1;
    pushdown(p);
    if (x <= mid)
      return query_0((p << 1), l, mid, x);
    else
      return query_0((p << 1 | 1), mid + 1, r, x);
    pushup(p);
  }
  int query_1(int p, int l, int r, int x) {
    if (l == r) return mx_1[p];
    int mid = (l + r) >> 1;
    pushdown(p);
    if (x <= mid)
      return query_1((p << 1), l, mid, x);
    else
      return query_1((p << 1 | 1), mid + 1, r, x);
    pushup(p);
  }
  void cover(int p, int l, int r, int sl, int sr) {
    if (sl <= l && r <= sr) {
      swap(mx_0[p], mx_1[p]);
      rev[p] ^= 1;
      return;
    }
    int mid = (l + r) >> 1;
    pushdown(p);
    if (sl <= mid) cover((p << 1), l, mid, sl, sr);
    if (mid < sr) cover((p << 1 | 1), mid + 1, r, sl, sr);
    pushup(p);
  }
  void Dfs(int u, int y, int val, int dep) {
    in[u] = ++cnt;
    if (val)
      modify(1, 1, n, in[u], 0, dep);
    else
      modify(1, 1, n, in[u], dep, 0);
    for (int i = head[u]; i; i = e[i].nxt) {
      int v = e[i].v;
      if (v == y) continue;
      to[e[i].id] = v;
      Dfs(v, u, val ^ e[i].w, dep + 1);
    }
    out[u] = cnt;
  }
  void Cover(int id) { cover(1, 1, n, in[to[id]], out[to[id]]); }
} T[2];
void dfs(int u, int y, int &root) {
  dep[u] = dep[y] + 1;
  if (dep[u] > dep[root]) root = u;
  for (int i = head[u]; i; i = e[i].nxt) {
    int v = e[i].v;
    if (v == y) continue;
    dfs(v, u, root);
  }
}
int main() {
  n = rd();
  for (int i = 1, u, v, w; i < n; i++) {
    u = rd();
    v = rd();
    w = rd();
    add(u, v, w, i);
    add(v, u, w, i);
  }
  dfs(1, 0, rt);
  dfs(rt, 0, rt1);
  T[0].Dfs(rt, 0, 0, 0);
  T[1].Dfs(rt1, 0, 0, 0);
  m = rd();
  for (int id; m; m--) {
    id = rd();
    T[0].Cover(id);
    T[1].Cover(id);
    printf("%d\n", max(T[0].mx_0[1], T[1].mx_0[1]));
  }
  return 0;
}
