#include <bits/stdc++.h>
using namespace std;
int n;
int a[500005];
struct EDGE {
  int to;
  EDGE *las;
  int id;
};
EDGE e[500005 * 2];
int ne;
EDGE *last[500005];
void link(int u, int v, int id) {
  e[ne] = {v, last[u], id};
  last[u] = e + ne++;
}
struct Graph {
  int rt;
  int dep[500005], val[500005], in[500005], out[500005], re[500005], cnt;
  int rel[500005];
  int mx[500005 * 4][2], tag[500005 * 4];
  void predfs(int x, int fa) {
    in[x] = ++cnt;
    re[cnt] = x;
    for (EDGE *ei = last[x]; ei; ei = ei->las)
      if (ei->to != fa) {
        rel[ei->id] = ei->to;
        dep[ei->to] = dep[x] + 1;
        val[ei->to] = val[x] ^ a[ei->id];
        predfs(ei->to, x);
      }
    out[x] = cnt;
  }
  void pd(int k) {
    if (tag[k]) {
      swap(mx[k << 1][0], mx[k << 1][1]);
      swap(mx[k << 1 | 1][0], mx[k << 1 | 1][1]);
      tag[k << 1] ^= 1, tag[k << 1 | 1] ^= 1;
      tag[k] = 0;
    }
  }
  void upd(int k) {
    mx[k][0] = max(mx[k << 1][0], mx[k << 1 | 1][0]);
    mx[k][1] = max(mx[k << 1][1], mx[k << 1 | 1][1]);
  }
  void build(int k, int l, int r) {
    if (l == r) {
      mx[k][val[re[l]] & 1] = dep[re[l]];
      mx[k][val[re[l]] & 1 ^ 1] = -1;
      return;
    }
    int mid = l + r >> 1;
    build(k << 1, l, mid);
    build(k << 1 | 1, mid + 1, r);
    upd(k);
  }
  void modify(int k, int l, int r, int st, int en) {
    if (st <= l && r <= en) {
      swap(mx[k][0], mx[k][1]);
      tag[k] ^= 1;
      return;
    }
    pd(k);
    int mid = l + r >> 1;
    if (st <= mid) modify(k << 1, l, mid, st, en);
    if (mid < en) modify(k << 1 | 1, mid + 1, r, st, en);
    upd(k);
  }
  int query() { return mx[1][0]; }
  void init() {
    predfs(rt, 0);
    build(1, 1, n);
  }
} S, T;
queue<int> q;
void find() {
  static int dis[500005];
  q.push(1);
  dis[1] = 1;
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    for (EDGE *ei = last[x]; ei; ei = ei->las)
      if (!dis[ei->to]) dis[ei->to] = dis[x] + 1, q.push(ei->to);
  }
  S.rt = 1;
  for (int i = 2; i <= n; ++i)
    if (dis[i] > dis[S.rt]) S.rt = i;
  memset(dis, 0, sizeof dis);
  q.push(S.rt);
  dis[S.rt] = 1;
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    for (EDGE *ei = last[x]; ei; ei = ei->las)
      if (!dis[ei->to]) dis[ei->to] = dis[x] + 1, q.push(ei->to);
  }
  T.rt = 1;
  for (int i = 2; i <= n; ++i)
    if (dis[i] > dis[T.rt]) T.rt = i;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i < n; ++i) {
    int u, v;
    scanf("%d%d%d", &u, &v, &a[i]);
    link(u, v, i);
    link(v, u, i);
  }
  find();
  S.init();
  T.init();
  int Q;
  scanf("%d", &Q);
  while (Q--) {
    int x;
    scanf("%d", &x);
    S.modify(1, 1, n, S.in[S.rel[x]], S.out[S.rel[x]]);
    T.modify(1, 1, n, T.in[T.rel[x]], T.out[T.rel[x]]);
    printf("%d\n", max(S.query(), T.query()));
  }
  return 0;
}
