#include <bits/stdc++.h>
using namespace std;
struct ED {
  int s, e, t;
} E[515151];
vector<int> edge[515151][2];
int mx, mxw;
int st[515151], en[515151], nn, depth[515151], flag[515151];
void dfs(int w, int bef, int dep, int fl) {
  if (mx < dep) mx = dep, mxw = w;
  depth[w] = dep;
  flag[w] = fl;
  st[w] = ++nn;
  for (int nxt : edge[w][0])
    if (bef != nxt) dfs(nxt, w, dep + 1, fl);
  for (int nxt : edge[w][1])
    if (bef != nxt) dfs(nxt, w, dep + 1, !fl);
  en[w] = nn;
}
struct TR {
  int flip, mx[2];
} tree[1616161];
void spread(int w) {
  int c1 = w * 2, c2 = w * 2 + 1;
  if (!tree[w].flip) return;
  tree[c1].flip ^= 1;
  swap(tree[c1].mx[0], tree[c1].mx[1]);
  tree[c2].flip ^= 1;
  swap(tree[c2].mx[0], tree[c2].mx[1]);
  tree[w].flip = 0;
}
void update(int w) {
  int c1 = w * 2, c2 = w * 2 + 1;
  tree[w].mx[0] = max(tree[c1].mx[0], tree[c2].mx[0]);
  tree[w].mx[1] = max(tree[c1].mx[1], tree[c2].mx[1]);
}
void insert_g(int w, int s, int e, int p, int val, int flag) {
  if (s == e) {
    tree[w].mx[flag] = val;
    return;
  }
  int m = (s + e) / 2;
  if (p <= m)
    insert_g(w * 2, s, m, p, val, flag);
  else
    insert_g(w * 2 + 1, m + 1, e, p, val, flag);
  update(w);
}
void flip(int w, int s, int e, int l, int r) {
  if (s != e) spread(w);
  if (s == l && e == r) {
    tree[w].flip = 1;
    swap(tree[w].mx[0], tree[w].mx[1]);
    return;
  }
  int m = (s + e) / 2;
  if (l <= m) flip(w * 2, s, m, l, min(m, r));
  if (m < r) flip(w * 2 + 1, m + 1, e, max(m + 1, l), r);
  update(w);
}
int ans[2][515151];
int edge_idx_a[515151];
int main() {
  int n;
  scanf("%d", &n);
  int i, j;
  for (i = 1; i <= n - 1; i++) {
    int s, e, t;
    scanf("%d%d%d", &s, &e, &t);
    E[i] = {s, e, t};
    edge[s][t].push_back(e);
    edge[e][t].push_back(s);
  }
  int m;
  scanf("%d", &m);
  for (int i = 0; i < m; i++) scanf("%d", &edge_idx_a[i]);
  mx = mxw = 0;
  nn = 0;
  dfs(1, -1, 0, 0);
  int root[2] = {
      mxw,
  };
  nn = 0;
  dfs(root[0], -1, 0, 0);
  root[1] = mxw;
  for (int tt = 0; tt < 2; tt++) {
    nn = 0;
    dfs(root[tt], -1, 0, 0);
    int tn;
    for (tn = 1; tn < n; tn *= 2)
      ;
    for (i = 1; i <= n; i++) insert_g(1, 1, tn, st[i], depth[i], flag[i]);
    for (i = 0; i < m; i++) {
      int edge_idx = edge_idx_a[i];
      int s = E[edge_idx].s, e = E[edge_idx].e, t = E[edge_idx].t;
      if (depth[s] > depth[e])
        flip(1, 1, tn, st[s], en[s]);
      else
        flip(1, 1, tn, st[e], en[e]);
      ans[tt][i] = tree[1].mx[0];
    }
    for (i = 0; i <= tn * 2; i++) tree[i] = {0, {0, 0}};
  }
  for (i = 0; i < m; i++) {
    printf("%d\n", max(ans[0][i], ans[1][i]));
  }
  return 0;
}
