#include <bits/stdc++.h>
using namespace std;
using LL = long long;
using ULL = unsigned long long;
using pii = pair<int, int>;
using PLL = pair<LL, LL>;
using UI = unsigned int;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
const double EPS = 1e-8;
const double PI = acos(-1.0);
const int N = 5e5 + 10;
int n, Q, dfs_cnt;
bool edge[N];
vector<pii> V[N];
int buf[N];
bool tag[N];
struct Tree {
  int lft[N], rgt[N], bottom[N], l[N << 2], r[N << 2], S[N << 2][2];
  bool lazy[N << 2];
  void dfs(int x, int fa, int dep, bool f) {
    lft[x] = ++dfs_cnt;
    buf[dfs_cnt] = dep;
    tag[dfs_cnt] = f;
    for (auto p : V[x]) {
      if (p.first == fa) continue;
      bottom[p.second] = p.first;
      dfs(p.first, x, dep + 1, f ^ edge[p.second]);
    }
    rgt[x] = dfs_cnt;
  }
  void build(int o, int ll, int rr) {
    l[o] = ll;
    r[o] = rr;
    lazy[o] = 0;
    if (ll < rr) {
      int mid = l[o] + r[o] >> 1;
      build(o << 1, ll, mid);
      build(o << 1 | 1, mid + 1, rr);
      S[o][0] = max(S[o << 1][0], S[o << 1 | 1][0]);
      S[o][1] = max(S[o << 1][1], S[o << 1 | 1][1]);
    } else {
      if (tag[ll]) {
        S[o][0] = 0;
        S[o][1] = buf[ll];
      } else {
        S[o][0] = buf[ll];
        S[o][1] = 0;
      }
    }
  }
  int pushdown(int o) {
    int mid = l[o] + r[o] >> 1;
    if (lazy[o]) {
      update(o << 1, l[o], mid);
      update(o << 1 | 1, mid + 1, r[o]);
      lazy[o] = 0;
    }
    return mid;
  }
  void update(int o, int ll, int rr) {
    if (l[o] == ll && r[o] == rr) {
      lazy[o] ^= 1;
      swap(S[o][0], S[o][1]);
      return;
    }
    int mid = pushdown(o);
    if (rr <= mid)
      update(o << 1, ll, rr);
    else if (ll > mid)
      update(o << 1 | 1, ll, rr);
    else {
      update(o << 1, ll, mid);
      update(o << 1 | 1, mid + 1, rr);
    }
    S[o][0] = max(S[o << 1][0], S[o << 1 | 1][0]);
    S[o][1] = max(S[o << 1][1], S[o << 1 | 1][1]);
  }
  void init(int x) {
    dfs_cnt = 0;
    dfs(x, -1, 0, 0);
    build(1, 1, n);
  }
  void flip(int x) {
    x = bottom[x];
    update(1, lft[x], rgt[x]);
  }
} tree[2];
int dist[N];
int bfs(int x) {
  for (int i = (1); i < (n + 1); ++i) dist[i] = inf;
  dist[x] = 0;
  int ret = x;
  queue<int> Q;
  Q.emplace(x);
  while (!Q.empty()) {
    x = Q.front();
    Q.pop();
    if (dist[x] > dist[ret]) ret = x;
    for (pii p : V[x]) {
      if (dist[p.first] == inf) {
        dist[p.first] = dist[x] + 1;
        Q.emplace(p.first);
      }
    }
  }
  return ret;
}
int main() {
  int x, y, z;
  scanf("%d", &n);
  for (int i = (1); i < (n); ++i) {
    scanf("%d %d %d", &x, &y, &z);
    V[x].emplace_back(y, i);
    V[y].emplace_back(x, i);
    edge[i] = z;
  }
  x = bfs(1);
  y = bfs(x);
  tree[0].init(x);
  tree[1].init(y);
  scanf("%d", &Q);
  while (Q--) {
    scanf("%d", &x);
    tree[0].flip(x);
    tree[1].flip(x);
    printf("%d\n", max(tree[0].S[1][0], tree[1].S[1][0]));
  }
  return 0;
}
