#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f, N = 5e5 + 10;
template <typename T>
void rd_(T &x) {
  x = 0;
  int f = 1;
  char ch = getchar();
  for (; ch > '9' || ch < '0'; ch = getchar())
    if (ch == '-') f = -1;
  for (; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
  x *= f;
}
int n, m, a[N], b[N], d[N], root, par[N];
vector<pair<int, int> > g[N];
void dfs_(int u) {
  d[u] = d[par[u]] + 1;
  if (d[u] > d[root]) root = u;
  for (int v, i = 0; i < (int)g[u].size(); i++) {
    v = g[u][i].first;
    if (par[u] == v) continue;
    par[v] = u, dfs_(v);
  }
}
struct Tree {
  int par[N], dfn[N], tot, mx[N << 2][2], d[N], siz[N], ar[N], br[N];
  bool rev[N << 2];
  void pushup_(int o) {
    mx[o][0] = max(mx[o << 1][0], mx[o << 1 | 1][0]);
    mx[o][1] = max(mx[o << 1][1], mx[o << 1 | 1][1]);
  }
  void build_(int o, int l, int r) {
    if (l == r) {
      mx[o][ar[l]] = br[l];
      mx[o][ar[l] ^ 1] = 0;
      return;
    }
    int mid = (l + r) >> 1;
    build_(o << 1, l, mid), build_(o << 1 | 1, mid + 1, r);
    pushup_(o);
  }
  void dfs_(int u, int k = 0) {
    d[u] = d[par[u]] + 1, dfn[u] = ++tot, siz[u] = 1, br[tot] = d[u] - 1,
    ar[tot] = k;
    for (int v, i = 0; i < (int)g[u].size(); i++) {
      v = g[u][i].first;
      if (v == par[u]) continue;
      par[v] = u;
      dfs_(v, k ^ g[u][i].second), siz[u] += siz[v];
    }
  }
  void set_(int x) {
    dfs_(x);
    build_(1, 1, n);
  }
  void pushrev_(int o) {
    swap(mx[o][0], mx[o][1]);
    rev[o] ^= 1;
  }
  void pushdown_(int o) {
    if (rev[o]) {
      rev[o] = 0;
      pushrev_(o << 1), pushrev_(o << 1 | 1);
    }
  }
  void vrev_(int o, int l, int r, int x, int y) {
    if (x <= l && r <= y) {
      pushrev_(o);
      return;
    }
    int mid = (l + r) >> 1;
    pushdown_(o);
    if (x <= mid) vrev_(o << 1, l, mid, x, y);
    if (mid < y) vrev_(o << 1 | 1, mid + 1, r, x, y);
    pushup_(o);
  }
  void solve_(int x) {
    if (d[a[x]] < d[b[x]]) swap(a[x], b[x]);
    vrev_(1, 1, n, dfn[a[x]], dfn[a[x]] + siz[a[x]] - 1);
  }
} A, B;
int main() {
  rd_(n);
  for (int x, i = 1; i < n; i++) {
    rd_(a[i]), rd_(b[i]), rd_(x);
    g[a[i]].push_back(pair<int, int>(b[i], x)),
        g[b[i]].push_back(pair<int, int>(a[i], x));
  }
  dfs_(1);
  A.set_(root);
  par[root] = 0, dfs_(root);
  B.set_(root);
  rd_(m);
  for (int x, i = 1; i <= m; i++) {
    rd_(x);
    A.solve_(x), B.solve_(x);
    printf("%d\n", max(A.mx[1][0], B.mx[1][0]));
  }
}
