#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5;
const int M = 8e5 + 5;
const int inf = 0x3f3f3f3f;
const long long mod = 1e8 + 7;
const double eps = 1e-8;
const long double pi = acos(-1.0L);
long long read() {
  long long x = 0, t = 1;
  char ch;
  while (!isdigit(ch = getchar()))
    if (ch == '-') t = -1;
  while (isdigit(ch)) {
    x = 10 * x + ch - '0';
    ch = getchar();
  }
  return x * t;
}
vector<pair<int, int> > e[N];
struct edge {
  int u, v, w;
} a[N];
int rt1, rt2, ma;
pair<int, int> ma1[N], ma2[N];
struct node {
  int c[N << 2][2], lz[N << 2], in[N], out[N], rk[N], dep[N], col[N], tot;
  inline void pushdown(int i) {
    swap(c[(i << 1)][0], c[(i << 1)][1]);
    swap(c[(i << 1 | 1)][0], c[(i << 1 | 1)][1]);
    lz[(i << 1)] ^= 1;
    lz[(i << 1 | 1)] ^= 1;
    lz[i] = 0;
  }
  inline void pushup(int i) {
    c[i][0] = max(c[(i << 1)][0], c[(i << 1 | 1)][0]);
    c[i][1] = max(c[(i << 1)][1], c[(i << 1 | 1)][1]);
  }
  void build(int i, int l, int r) {
    c[i][0] = c[i][1] = lz[i] = 0;
    if (l == r) return (void)(c[i][col[rk[l]]] = dep[rk[l]]);
    int mid = l + r >> 1;
    build((i << 1), l, mid);
    build((i << 1 | 1), mid + 1, r);
    pushup(i);
  }
  void update(int i, int l, int r, int ll, int rr) {
    if (ll <= l && r <= rr) return (void)(swap(c[i][0], c[i][1]), lz[i] ^= 1);
    int mid = l + r >> 1;
    if (lz[i]) pushdown(i);
    if (mid >= ll) update((i << 1), l, mid, ll, rr);
    if (mid < rr) update((i << 1 | 1), mid + 1, r, ll, rr);
    pushup(i);
  }
  void dfs(int u, int pre) {
    in[u] = ++tot;
    rk[tot] = u;
    dep[u] = dep[pre] + 1;
    for (auto x : e[u]) {
      int v = x.first, w = x.second;
      if (v == pre) continue;
      col[v] = col[u] ^ w;
      dfs(v, u);
    }
    out[u] = tot;
  }
} tr[2];
void dfs2(int u, int pre) {
  ma1[u] = ma2[u] = make_pair(0, u);
  for (auto x : e[u]) {
    int v = x.first;
    if (v == pre) continue;
    dfs2(v, u);
    pair<int, int> t = ma1[v];
    if (t > ma1[u]) swap(t, ma1[u]);
    if (t > ma2[u]) ma2[u] = t;
  }
  if (ma1[u].first + ma2[u].first > ma)
    ma = ma1[u].first + ma2[u].first, rt1 = ma1[u].second, rt2 = ma2[u].second;
  ma1[u].first++;
  ma2[u].first++;
}
int main() {
  int n = read();
  for (int i = 1; i < n; i++) {
    int x = read(), y = read(), z = read();
    a[i] = edge{x, y, z};
    e[x].emplace_back(y, z);
    e[y].emplace_back(x, z);
  }
  dfs2(1, 0);
  tr[0].dfs(rt1, 0);
  tr[0].build(1, 1, n);
  tr[1].dfs(rt2, 0);
  tr[1].build(1, 1, n);
  int m = read();
  for (int i = 1; i <= m; i++) {
    int x = read(), y = a[x].u;
    if (tr[0].dep[a[x].u] < tr[0].dep[a[x].v]) y = a[x].v;
    tr[0].update(1, 1, n, tr[0].in[y], tr[0].out[y]);
    y = a[x].u;
    if (tr[1].dep[a[x].u] < tr[1].dep[a[x].v]) y = a[x].v;
    tr[1].update(1, 1, n, tr[1].in[y], tr[1].out[y]);
    printf("%d\n", max(tr[0].c[1][0], tr[1].c[1][0]) - 1);
  }
  return 0;
}
