#include <bits/stdc++.h>
using namespace std;
auto seed = chrono::high_resolution_clock::now().time_since_epoch().count();
mt19937 mt(seed);
struct edge {
  int to, w;
  edge() {}
  edge(int to, int w) : to(to), w(w) {}
};
const int MAXN = 500000;
int pp, cur, tmp, vv, ll, rr;
int used[MAXN], roots[2];
vector<vector<int> > d(MAXN, vector<int>(2)), cnt(MAXN, vector<int>(2)),
    a(2 * MAXN, vector<int>(2));
vector<vector<vector<int> > > place(MAXN, vector<vector<int> >(2));
vector<vector<edge> > g(MAXN);
void dfs(int v, int x, short p) {
  used[v] = 1;
  if (p) {
    a[pp][x] = v;
    cnt[v][x] = cur;
    place[v][x].push_back(pp);
    pp++;
  }
  for (auto &e : g[v]) {
    if (!used[e.to]) {
      d[e.to][x] = d[v][x] + 1;
      if (e.w == 1) cur ^= 1;
      dfs(e.to, x, p);
      if (e.w == 1) cur ^= 1;
    }
  }
  if (p) {
    a[pp][x] = v;
    cnt[v][x] = cur;
    place[v][x].push_back(pp);
    pp++;
  }
}
struct node {
  short swp;
  int ans[2];
  node() {
    swp = 0;
    ans[0] = 0;
    ans[1] = 0;
  }
};
struct tree {
  vector<node> t;
  tree(short x, int n) {
    t.resize(4 * n);
    build(0, 0, n, x);
  }
  void pull() {
    t[vv].ans[0] = max(t[vv + vv + 1].ans[0], t[vv + vv + 2].ans[0]);
    t[vv].ans[1] = max(t[vv + vv + 1].ans[1], t[vv + vv + 2].ans[1]);
  }
  void push(int x) {
    if (!t[vv].swp) return;
    t[vv].swp = 0;
    tmp = t[vv].ans[0];
    t[vv].ans[0] = t[vv].ans[1];
    t[vv].ans[1] = tmp;
    if (x == 1) return;
    t[vv + vv + 1].swp ^= 1;
    t[vv + vv + 2].swp ^= 1;
  }
  void build(int bv, int bl, int br, short x) {
    if (br - bl == 1) {
      t[bv].ans[cnt[a[bl][x]][x]] = d[a[bl][x]][x];
      return;
    }
    int m = (bl + br) >> 1;
    build(bv + bv + 1, bl, m, x);
    build(bv + bv + 2, m, br, x);
    vv = bv;
    pull();
  }
  void update(int vl, int vr) {
    push(vr - vl);
    if (rr <= vl || vr <= ll) return;
    if (ll <= vl && vr <= rr) {
      t[vv].swp = 1;
      push(vr - vl);
      return;
    }
    tmp = (vl + vr) >> 1;
    vv = vv + vv + 1;
    update(vl, tmp);
    tmp = (vl + vr) >> 1;
    vv++;
    update(tmp, vr);
    vv = vv / 2 - 1;
    pull();
  }
};
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int n, m, i, j;
  cin >> n;
  vector<pair<int, int> > e(n);
  for (i = 1; i < n; i++) {
    int v, u, w;
    cin >> v >> u >> w;
    g[v - 1].emplace_back(u - 1, w);
    g[u - 1].emplace_back(v - 1, w);
    e[i] = {v - 1, u - 1};
  }
  cin >> m;
  for (i = 0; i < n; i++) used[i] = 0;
  roots[0] = 0;
  roots[1] = 0;
  for (i = 0; i < 2; i++) {
    d[roots[0]][0] = 0;
    dfs(roots[0], 0, 0);
    for (j = 0; j < n; j++) {
      if (d[roots[i]][0] < d[j][0]) roots[i] = j;
      used[j] = 0;
    }
  }
  for (i = 0; i < 2; i++) {
    pp = 0;
    cur = 0;
    d[roots[i]][i] = 0;
    dfs(roots[i], i, 1);
    for (j = 0; j < n; j++) used[j] = 0;
  }
  vector<tree> t = {tree(0, 2 * n), tree(1, 2 * n)};
  for (i = 0; i < m; i++) {
    int x, ans = 0;
    cin >> x;
    for (j = 0; j < 2; j++) {
      int v = e[x].first;
      if (d[e[x].first][j] < d[e[x].second][j]) v = e[x].second;
      vv = 0;
      ll = place[v][j][0];
      rr = place[v][j][1] + 1;
      t[j].update(0, 2 * n);
      ans = max(ans, t[j].t[0].ans[0]);
    }
    cout << ans << "\n";
  }
  return 0;
}
