#include <bits/stdc++.h>
using namespace std;
const int SZ = 1 << 19;
vector<pair<int, int>> adj[500000];
pair<int, int> E[500000];
int node_cnt, num[500000], R[500000], parent[500000], depth[500000],
    tree[2 * SZ][3], Q[500000], ans[500000];
void lazy_propagation(int bit, int s, int e) {
  if (tree[bit][2]) {
    swap(tree[bit][0], tree[bit][1]);
    if (s < e) {
      tree[2 * bit][2] ^= 1;
      tree[2 * bit + 1][2] ^= 1;
    }
    tree[bit][2] = 0;
  }
}
int bfs(int c) {
  queue<int> Q;
  memset(depth, -1, sizeof(depth));
  depth[c] = 0;
  Q.push(c);
  while (!Q.empty()) {
    c = Q.front();
    Q.pop();
    for (auto [n, w] : adj[c])
      if (depth[n] == -1) {
        depth[n] = depth[c] + 1;
        Q.push(n);
      }
  }
  return c;
}
void dfs(int c, int v) {
  num[c] = ++node_cnt;
  tree[SZ + num[c]][v] = depth[c];
  for (auto [n, w] : adj[c])
    if (num[n] == 0) {
      parent[n] = c;
      depth[n] = depth[c] + 1;
      dfs(n, w ^ v);
    }
  R[c] = node_cnt;
}
void flip(int n1, int n2, int bit = 1, int s = 0, int e = SZ - 1) {
  int m = (s + e) >> 1;
  lazy_propagation(bit, s, e);
  if (n2 < n1 || n2 < s || e < n1) return;
  if (n1 <= s && e <= n2) {
    tree[bit][2] = 1;
    lazy_propagation(bit, s, e);
    return;
  }
  flip(n1, n2, 2 * bit, s, m);
  flip(n1, n2, 2 * bit + 1, m + 1, e);
  tree[bit][0] = max(tree[2 * bit][0], tree[2 * bit + 1][0]);
  tree[bit][1] = max(tree[2 * bit][1], tree[2 * bit + 1][1]);
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  ((void)0);
  ((void)0);
  ((void)0);
  int N, M, r;
  cin >> N;
  for (int i = 1; i < N; i++) {
    int v;
    cin >> E[i].first >> E[i].second >> v;
    adj[--E[i].first].emplace_back(--E[i].second, v);
    adj[E[i].second].emplace_back(E[i].first, v);
  }
  r = bfs(0);
  depth[parent[r] = r] = 0;
  dfs(r, 0);
  for (int i = SZ; --i;)
    for (int j = 0; j < 2; j++)
      tree[i][j] = max(tree[2 * i][j], tree[2 * i + 1][j]);
  cin >> M;
  for (int c = 0; c < M; c++) {
    int i;
    cin >> Q[c];
    if (parent[E[Q[c]].first] == E[Q[c]].second)
      i = E[Q[c]].first;
    else
      i = E[Q[c]].second;
    flip(num[i], R[i]);
    ans[c] = tree[1][0];
  }
  r = bfs(r);
  memset(num, 0, sizeof(num));
  memset(tree, 0, sizeof(tree));
  node_cnt = depth[parent[r] = r] = 0;
  dfs(r, 0);
  for (int i = SZ; --i;)
    for (int j = 0; j < 2; j++)
      tree[i][j] = max(tree[2 * i][j], tree[2 * i + 1][j]);
  for (int c = 0; c < M; c++) {
    int i;
    if (parent[E[Q[c]].first] == E[Q[c]].second)
      i = E[Q[c]].first;
    else
      i = E[Q[c]].second;
    flip(num[i], R[i]);
    cout << max(ans[c], tree[1][0]) << '\n';
  }
  return 0;
}
