#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline bool upmin(T &x, T y) {
  return y < x ? x = y, 1 : 0;
}
template <typename T>
inline bool upmax(T &x, T y) {
  return x < y ? x = y, 1 : 0;
}
const long double eps = 1e-11;
const long double pi = acos(-1);
const int oo = 1 << 30;
const long long loo = 1ll << 62;
const int mods = 998244353;
const int MAXN = 1000005;
const int INF = 0x3f3f3f3f;
inline long long read() {
  long long f = 1, x = 0;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    x = (x << 3) + (x << 1) + (c ^ 48);
    c = getchar();
  }
  return x * f;
}
int edgenum = 1, head[MAXN], to[MAXN], nxt[MAXN], c[MAXN];
int DFN = 0, low[MAXN], lowu[MAXN], lowv[MAXN], dfn[MAXN], dfnu[MAXN],
    dfnv[MAXN], y[MAXN], yu[MAXN], yv[MAXN], dep[MAXN], w[MAXN], id[MAXN];
void add(int u, int v, int C) {
  edgenum++, to[edgenum] = v, c[edgenum] = C, nxt[edgenum] = head[u],
             head[u] = edgenum;
}
void dfs(int x, int father) {
  id[dfn[x] = ++DFN] = x, dep[x] = dep[father] + 1;
  for (int i = head[x]; i; i = nxt[i]) {
    if (to[i] == father) continue;
    w[to[i]] = w[x] ^ c[i];
    y[i >> 1] = to[i];
    dfs(to[i], x);
  }
  low[x] = DFN;
}
struct Segment_Tree {
  int mx0[MAXN << 2], mx1[MAXN << 2], tag[MAXN << 2];
  void down(int x) {
    if (tag[x])
      swap(mx0[x << 1], mx1[x << 1]), swap(mx0[x << 1 | 1], mx1[x << 1 | 1]),
          tag[x << 1] ^= 1, tag[x << 1 | 1] ^= 1, tag[x] = 0;
  }
  void build(int x, int l, int r) {
    if (l == r) {
      if (w[id[l]])
        mx0[x] = -1, mx1[x] = dep[id[l]];
      else
        mx0[x] = dep[id[l]], mx1[x] = -1;
      return;
    }
    int mid = (l + r) >> 1;
    build(x << 1, l, mid);
    build(x << 1 | 1, mid + 1, r);
    mx0[x] = max(mx0[x << 1], mx0[x << 1 | 1]);
    mx1[x] = max(mx1[x << 1], mx1[x << 1 | 1]);
  }
  void reverse(int x, int l, int r, int L, int R) {
    if (l >= L && r <= R) {
      swap(mx0[x], mx1[x]);
      tag[x] ^= 1;
      return;
    }
    down(x);
    int mid = (l + r) >> 1;
    if (R <= mid)
      reverse(x << 1, l, mid, L, R);
    else if (L > mid)
      reverse(x << 1 | 1, mid + 1, r, L, R);
    else
      reverse(x << 1, l, mid, L, mid),
          reverse(x << 1 | 1, mid + 1, r, mid + 1, R);
    mx0[x] = max(mx0[x << 1], mx0[x << 1 | 1]);
    mx1[x] = max(mx1[x << 1], mx1[x << 1 | 1]);
  }
} Tu, Tv;
signed main() {
  int n = read(), U = 0, V = 0;
  for (int i = 1; i < n; i++) {
    int u = read(), v = read(), c = read();
    add(u, v, c), add(v, u, c);
  }
  DFN = 0, w[1] = 0, dfs(1, 0);
  for (int i = 1; i <= n; i++)
    if (dep[i] > dep[U]) U = i;
  DFN = 0, w[U] = 0, dfs(U, 0);
  for (int i = 1; i <= n; i++) dfnu[i] = dfn[i], lowu[i] = low[i], yu[i] = y[i];
  Tu.build(1, 1, n);
  for (int i = 1; i <= n; i++)
    if (dep[i] > dep[V]) V = i;
  DFN = 0, w[V] = 0, dfs(V, 0);
  for (int i = 1; i <= n; i++) dfnv[i] = dfn[i], lowv[i] = low[i], yv[i] = y[i];
  Tv.build(1, 1, n);
  int Case = read();
  while (Case--) {
    int t = read(), x = yu[t], y = yv[t];
    Tu.reverse(1, 1, n, dfnu[x], lowu[x]);
    Tv.reverse(1, 1, n, dfnv[y], lowv[y]);
    printf("%d\n", max(Tu.mx0[1], Tv.mx0[1]) - 1);
  }
  return 0;
}
