#include <bits/stdc++.h>
using namespace std;
const int N = 500005;
int ne[N << 1], fi[N], zz[N << 1], Id, sl[N << 1], tot, in[N], out[N], num[N],
    x[N], y[N], z[N], n, m, s, t, dis1[N], dis2[N], id[N];
queue<int> q;
struct Tree {
  int l, r, num1, num2, num3, num4, flag1, flag2;
} T[N * 4];
inline int pd(int x, int y) { return in[x] <= in[y] && out[x] >= out[y]; }
inline void jb(int x, int y, int z) {
  ne[++tot] = fi[x];
  fi[x] = tot;
  zz[tot] = y;
  sl[tot] = z;
}
void dfs(int x, int y, int z) {
  num[x] = z;
  in[x] = ++tot;
  id[tot] = x;
  for (int i = fi[x]; i; i = ne[i])
    if (zz[i] != y) dfs(zz[i], x, z ^ sl[i]);
  out[x] = tot;
}
inline void update(int x) {
  T[x].num1 = max(T[x * 2].num1, T[x * 2 + 1].num1);
  T[x].num2 = max(T[x * 2].num2, T[x * 2 + 1].num2);
  T[x].num3 = max(T[x * 2].num3, T[x * 2 + 1].num3);
  T[x].num4 = max(T[x * 2].num4, T[x * 2 + 1].num4);
}
inline void filp1(int x) {
  T[x].flag1 ^= 1;
  swap(T[x].num1, T[x].num2);
}
inline void filp2(int x) {
  T[x].flag2 ^= 1;
  swap(T[x].num3, T[x].num4);
}
inline void down(int x) {
  if (T[x].flag1) {
    filp1(x * 2);
    filp1(x * 2 + 1);
  }
  if (T[x].flag2) {
    filp2(x * 2);
    filp2(x * 2 + 1);
  }
  T[x].flag1 = T[x].flag2 = 0;
}
void build(int x, int l, int r) {
  T[x].l = l;
  T[x].r = r;
  if (l == r) {
    if (num[id[l]] == num[s])
      T[x].num1 = dis1[id[l]];
    else
      T[x].num2 = dis1[id[l]];
    if (num[id[l]] == num[t])
      T[x].num3 = dis2[id[l]];
    else
      T[x].num4 = dis2[id[l]];
    return;
  }
  int mid = (l + r) / 2;
  build(x * 2, l, mid);
  build(x * 2 + 1, mid + 1, r);
  update(x);
}
void insert(int x, int l, int r) {
  if (T[x].l > r || l > T[x].r) return;
  if (T[x].l >= l && T[x].r <= r) {
    filp1(x);
    filp2(x);
    return;
  }
  down(x);
  insert(x * 2, l, r);
  insert(x * 2 + 1, l, r);
  update(x);
}
void bfs(int x, int dis[]) {
  for (int i = 1; i <= n; i++) dis[i] = -1;
  dis[x] = 0;
  q.push(x);
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    for (int i = fi[x]; i; i = ne[i])
      if (dis[zz[i]] == -1) {
        dis[zz[i]] = dis[x] + 1;
        q.push(zz[i]);
      }
  }
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i < n; i++) {
    scanf("%d%d%d", &x[i], &y[i], &z[i]);
    jb(x[i], y[i], z[i]);
    jb(y[i], x[i], z[i]);
  }
  tot = 0;
  dfs(1, 0, 0);
  for (int i = 1; i < n; i++)
    if (in[x[i]] > in[y[i]]) swap(x[i], y[i]);
  bfs(1, dis1);
  s = 1;
  for (int i = 2; i <= n; i++)
    if (dis1[i] > dis1[s]) s = i;
  t = 1;
  bfs(s, dis2);
  for (int i = 2; i <= n; i++)
    if (dis2[i] > dis2[t]) t = i;
  bfs(t, dis1);
  swap(dis1, dis2);
  build(1, 1, n);
  scanf("%d", &m);
  while (m--) {
    scanf("%d", &Id);
    if (pd(y[Id], s)) filp1(1);
    if (pd(y[Id], t)) filp2(1);
    insert(1, in[y[Id]], out[y[Id]]);
    printf("%d\n", max(T[1].num1, T[1].num3));
  }
}
