#include <bits/stdc++.h>
using ll = long long;
using ld = long double;
using namespace std;
const int T = 1 << 20;
int mx[T + T][2], flag[T + T];
void combine(int v) {
  for (int i = 0; i <= 1; ++i) mx[v][i] = max(mx[2 * v][i], mx[2 * v + 1][i]);
}
void change(int v) {
  flag[v] ^= 1;
  swap(mx[v][0], mx[v][1]);
}
void push(int v) {
  if (!flag[v]) return;
  for (auto u : {2 * v, 2 * v + 1}) change(u);
  flag[v] = 0;
}
void modify(int x, int y, int v = 1, int l = 0, int r = T - 1) {
  if (y < l || r < x) return;
  if (x <= l && r <= y) {
    change(v);
    return;
  }
  push(v);
  int m = l + r >> 1;
  modify(x, y, 2 * v, l, m);
  modify(x, y, 2 * v + 1, m + 1, r);
  combine(v);
}
const int N = 5e5 + 500;
int n, a, b, c, q, in[N][2], out[N][2], dis[N], parity[N], czas, edge[N][2];
struct gao {
  int u, w, id;
};
vector<gao> G[N];
pair<int, int> e;
void dfs(int v, int p) {
  dis[v] = dis[p] + 1;
  e = max(e, {dis[v], v});
  for (auto it : G[v]) {
    int u = it.u;
    if (u != p) dfs(u, v);
  }
}
void dfs2(int v, int p, int type) {
  in[v][type] = ++czas;
  for (auto it : G[v]) {
    int u = it.u;
    if (u != p) {
      parity[u] = parity[v] ^ it.w;
      edge[it.id][type] = u;
      dfs2(u, v, type);
    }
  }
  out[v][type] = czas;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n - 1; ++i) {
    scanf("%d%d%d", &a, &b, &c);
    G[a].push_back({b, c, i});
    G[b].push_back({a, c, i});
  }
  dfs(1, 0);
  int end[2];
  end[0] = e.second;
  e = {0, 0};
  dfs(end[0], 0);
  end[1] = e.second;
  for (int j = 0; j <= 1; ++j) {
    for (int i = 1; i <= n; ++i) parity[i] = 0;
    dfs(end[j], 0);
    dfs2(end[j], 0, j);
    for (int i = 1; i <= n; ++i) mx[in[i][j] + T][parity[i] % 2] = dis[i];
  }
  for (int i = T - 1; 1 <= i; --i) combine(i);
  scanf("%d", &q);
  while (q--) {
    scanf("%d", &a);
    for (int i = 0; i <= 1; ++i) modify(in[edge[a][i]][i], out[edge[a][i]][i]);
    printf("%d\n", mx[1][0] - 1);
  }
  return 0;
}
