#include <bits/stdc++.h>
using namespace std;
mt19937 rng(time(0));
uniform_int_distribution<int> uid(-1e9, 1e9);
vector<vector<int>> g[500009];
int rt = 0, d1[500005], f1[500005], s1[500005], c1[500005], p1[500005],
    d2[500005], f2[500005], s2[500005], p2[500005], c2[500005];
vector<int> v, w;
void dfs(vector<int>& v, int f[], int d[], int p[], int s[], int c[], int x,
         int px, int cx, int fx) {
  if (fx) {
    f[x] = v.size();
    v.push_back(x);
    c[x] = cx;
  }
  d[x] = d[px] + 1;
  if (d[x] > d[rt]) rt = x;
  for (auto& i : g[x])
    if (i[0] != px) {
      p[i[2]] = i[0];
      dfs(v, f, d, p, s, c, i[0], x, (cx + i[1]) % 2, fx);
    }
  if (fx) s[x] = v.size();
}
struct segtree {
  int sz;
  vector<int> a;
  vector<pair<int, int>> t;
  segtree(vector<int>& v, int d[], int c[]) {
    sz = v.size();
    a.assign(4 * sz, 0);
    t.assign(4 * sz, {0, 0});
    build(d, c, v, 0, 0, sz);
  }
  void push(int x, int lx, int rx) {
    if (!a[x]) return;
    a[x] = 0;
    swap(t[x].first, t[x].second);
    if (lx + 1 != rx) a[2 * x + 1] ^= 1, a[2 * x + 2] ^= 1;
  }
  void build(int d[], int c[], vector<int>& v, int x, int lx, int rx) {
    if (lx + 1 == rx) {
      if (!c[v[lx]])
        t[x] = {d[v[lx]], 0};
      else
        t[x] = {0, d[v[lx]]};
      return;
    }
    int mx = (lx + rx) / 2;
    build(d, c, v, 2 * x + 1, lx, mx);
    build(d, c, v, 2 * x + 2, mx, rx);
    t[x].first = max(t[2 * x + 1].first, t[2 * x + 2].first);
    t[x].second = max(t[2 * x + 1].second, t[2 * x + 2].second);
  }
  void modify(int l, int r, int x, int lx, int rx) {
    if (l <= lx && rx <= r) {
      a[x] ^= 1;
      push(x, lx, rx);
      return;
    }
    push(x, lx, rx);
    if (rx <= l || r <= lx) return;
    int mx = (lx + rx) / 2;
    modify(l, r, 2 * x + 1, lx, mx);
    modify(l, r, 2 * x + 2, mx, rx);
    t[x].first = max(t[2 * x + 1].first, t[2 * x + 2].first);
    t[x].second = max(t[2 * x + 1].second, t[2 * x + 2].second);
  }
  int query(int l, int r, int x, int lx, int rx) {
    push(x, lx, rx);
    if (l <= lx && rx <= r) return t[x].first;
    if (r <= lx || rx <= l) return 0;
    int mx = (lx + rx) / 2;
    return max(query(l, r, 2 * x + 1, lx, mx), query(l, r, 2 * x + 2, mx, rx));
  }
};
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n, x, y, q;
  cin >> n;
  for (int i = 0; i < n - 1; ++i) {
    cin >> x >> y >> q;
    --x, --y;
    g[x].push_back({y, q, i});
    g[y].push_back({x, q, i});
  }
  d1[0] = -1;
  dfs(v, f1, d1, p1, s1, c1, 0, 0, 0, 0);
  d1[rt] = -1;
  dfs(v, f1, d1, p1, s1, c1, rt, rt, 0, 1);
  d2[rt] = -1;
  dfs(w, f2, d2, p2, s2, c2, rt, rt, 0, 1);
  segtree st1(v, d1, c1), st2(w, d2, c2);
  cin >> q;
  while (q--) {
    cin >> x;
    --x;
    st1.modify(f1[p1[x]], s1[p1[x]], 0, 0, st1.sz);
    st2.modify(f2[p2[x]], s2[p2[x]], 0, 0, st2.sz);
    cout << max(st1.query(0, st1.sz, 0, 0, st1.sz),
                st2.query(0, st2.sz, 0, 0, st2.sz))
         << '\n';
  }
}
