#include <bits/stdc++.h>
using namespace std;
const int N = 500005;
int n, m, id, rt, u[N], v[N], d[N], dis[N];
vector<int> vec[N];
struct tree {
  int rt, cnt, head[N], to[N * 2], nxt[N * 2], dd[N * 2];
  int idx, fa[N], dep[N], val[N], in[N], out[N], pos[N], tag[N * 4],
      maxn[N * 4][2];
  void adde(int u, int v, int d) {
    to[++cnt] = v;
    nxt[cnt] = head[u];
    dd[cnt] = d;
    head[u] = cnt;
  }
  void dfs(int u) {
    in[u] = ++idx;
    pos[idx] = u;
    dep[u] = dep[fa[u]] + 1;
    int v;
    for (int i = head[u]; i; i = nxt[i]) {
      v = to[i];
      if (v != fa[u]) {
        fa[v] = u;
        val[v] = val[u] ^ dd[i];
        dfs(v);
      }
    }
    out[u] = idx;
  }
  int merge(int u, int v) { return dep[u] > dep[v] ? u : v; }
  void build(int o, int l, int r) {
    if (l == r) {
      maxn[o][val[pos[l]]] = pos[l];
      return;
    }
    int mid = (l + r) / 2;
    build(o * 2, l, mid);
    build(o * 2 + 1, mid + 1, r);
    maxn[o][0] = merge(maxn[o * 2][0], maxn[o * 2 + 1][0]);
    maxn[o][1] = merge(maxn[o * 2][1], maxn[o * 2 + 1][1]);
  }
  void reverse(int o) {
    tag[o] ^= 1;
    swap(maxn[o][0], maxn[o][1]);
  }
  void pushdown(int o) {
    if (tag[o]) {
      reverse(o * 2);
      reverse(o * 2 + 1);
      tag[o] = 0;
    }
  }
  void update(int o, int l, int r, int L, int R) {
    if (L <= l && R >= r) {
      reverse(o);
      return;
    }
    pushdown(o);
    int mid = (l + r) / 2;
    if (L <= mid) {
      update(o * 2, l, mid, L, R);
    }
    if (R > mid) {
      update(o * 2 + 1, mid + 1, r, L, R);
    }
    maxn[o][0] = merge(maxn[o * 2][0], maxn[o * 2 + 1][0]);
    maxn[o][1] = merge(maxn[o * 2][1], maxn[o * 2 + 1][1]);
  }
  void build() {
    dfs(rt);
    build(1, 1, n);
  }
  void update(int u, int v) {
    if (fa[u] == v) {
      update(1, 1, n, in[u], out[u]);
    } else {
      update(1, 1, n, in[v], out[v]);
    }
  }
  int query() { return dep[maxn[1][0]] - 1; }
} t1, t2;
void dfs(int pre, int u) {
  dis[u] = dis[pre] + 1;
  if (dis[u] > dis[rt]) {
    rt = u;
  }
  for (int v : vec[u]) {
    if (v != pre) {
      dfs(u, v);
    }
  }
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i < n; i++) {
    scanf("%d%d%d", &u[i], &v[i], &d[i]);
    vec[u[i]].push_back(v[i]);
    vec[v[i]].push_back(u[i]);
    t1.adde(u[i], v[i], d[i]);
    t1.adde(v[i], u[i], d[i]);
    t2.adde(u[i], v[i], d[i]);
    t2.adde(v[i], u[i], d[i]);
  }
  dfs(0, rt = 1);
  t1.rt = rt;
  dfs(0, rt);
  t2.rt = rt;
  t1.build();
  t2.build();
  scanf("%d", &m);
  while (m--) {
    scanf("%d", &id);
    t1.update(u[id], v[id]);
    t2.update(u[id], v[id]);
    printf("%d\n", max(t1.query(), t2.query()));
  }
  return 0;
}
