#include <bits/stdc++.h>
using namespace std;
inline long long read() {
  long long x = 0, y = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') y = -y;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x * y;
}
namespace qiqi {
const int N = 5e5 + 5;
int n, Q, ecnt, head[N], pos[N], cnt, dfn[N], inv[N], siz[N], num, in[N],
    lg[N * 2], st[N * 2][20], tag[N * 4], val[N];
struct Edge {
  int v, w, nxt;
} e[N * 2];
inline void add(int u, int v, int w) {
  e[++ecnt] = (Edge){v, w, head[u]};
  head[u] = ecnt;
}
inline int dis(int x, int y) {
  if (!x || !y) return -1e9;
  x = in[x];
  y = in[y];
  if (x > y) swap(x, y);
  int z = lg[y - x + 1];
  return st[x][0] + st[y][0] - 2 * min(st[x][z], st[y - (1 << z) + 1][z]);
}
struct Val {
  int p[2], k;
  inline Val(int x = 0, int y = 0) { k = dis(p[0] = x, p[1] = y); }
  inline bool operator<(const Val &rhs) const { return k < rhs.k; }
  inline Val operator+(const Val &rhs) const {
    Val res = max(*this, rhs);
    for (int i = (0); i <= (1); ++i)
      for (int j = (0); j <= (1); ++j) res = max(res, Val(p[i], rhs.p[j]));
    return res;
  }
} mx[N * 4][2];
inline int ls(int x) { return x << 1; }
inline int rs(int x) { return x << 1 | 1; }
inline void push_up(int x) {
  for (int i = (0); i <= (1); ++i) mx[x][i] = mx[ls(x)][i] + mx[rs(x)][i];
}
inline void f(int x) {
  swap(mx[x][0], mx[x][1]);
  tag[x] ^= 1;
}
inline void push_down(int x) {
  if (tag[x]) {
    f(ls(x));
    f(rs(x));
    tag[x] = 0;
  }
}
void build(int x, int l, int r) {
  if (l == r) {
    mx[x][val[inv[l]]] = Val(inv[l], inv[l]);
    return;
  }
  int mid = l + ((r - l) >> 1);
  build(ls(x), l, mid);
  build(rs(x), mid + 1, r);
  push_up(x);
}
void upd(int x, int l, int r, int pl, int pr) {
  if (pl <= l && r <= pr) return f(x);
  push_down(x);
  int mid = l + ((r - l) >> 1);
  if (pl <= mid) upd(ls(x), l, mid, pl, pr);
  if (pr > mid) upd(rs(x), mid + 1, r, pl, pr);
  push_up(x);
}
void dfs(int u, int f, int d, int k) {
  siz[u] = 1;
  val[u] = k;
  st[in[u] = ++num][0] = d;
  inv[dfn[u] = ++cnt] = u;
  for (int i = head[u], v = e[i].v; i; v = e[i = e[i].nxt].v)
    if (v != f) {
      dfs(v, u, d + 1, k ^ e[i].w);
      pos[(i + 1) / 2] = v;
      st[++num][0] = d;
      siz[u] += siz[v];
    }
}
void main() {
  n = read();
  for (int i = (2); i <= (n); ++i) {
    int x = read(), y = read(), z = read();
    add(x, y, z);
    add(y, x, z);
  }
  dfs(1, 0, 1, 0);
  lg[0] = -1;
  for (int i = (1); i <= (num); ++i) lg[i] = lg[i >> 1] + 1;
  for (int j = (1); j <= (19); ++j)
    for (int i = (1); i <= (num - (1 << (j - 1))); ++i)
      st[i][j] = min(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]);
  build(1, 1, n);
  Q = read();
  while (Q--) {
    int x = pos[read()];
    upd(1, 1, n, dfn[x], dfn[x] + siz[x] - 1);
    printf("%d\n", max(mx[1][0], mx[1][1]).k);
  }
}
}  // namespace qiqi
int main() {
  qiqi::main();
  return 0;
}
