#include <bits/stdc++.h>
using namespace std;
template <typename T>
void read(T &x) {
  x = 0;
  int f = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  x *= f;
}
inline void write(int x) {
  if (x > 9) write(x / 10);
  putchar(x % 10 + '0');
}
const int N = 500005;
int n, ex[N], ey[N], ez[N];
vector<int> G[N];
int Timest, st[N << 1][20], Log[N << 1], idst[N];
int Timedfn, dfn[N], node[N], tl[N], tr[N], dpt[N], fa[N];
inline int Mn(int x, int y) { return dpt[x] < dpt[y] ? x : y; }
inline int LCA(int x, int y) {
  static int t;
  x = idst[x], y = idst[y];
  if (x > y) swap(x, y);
  t = Log[y - x + 1];
  return Mn(st[x][t], st[y - (1 << t) + 1][t]);
}
int val[N];
inline void dfs(int x) {
  dpt[x] = dpt[fa[x]] + 1;
  tl[x] = dfn[x] = ++Timedfn;
  st[idst[x] = ++Timest][0] = x;
  node[Timedfn] = x;
  for (int y, e, i = 0; i < G[x].size(); ++i) {
    e = G[x][i];
    if ((y = ex[e] + ey[e] - x) ^ fa[x]) {
      fa[y] = x;
      val[y] = val[x] ^ ez[e];
      dfs(y);
      st[++Timest][0] = x;
    }
  }
  tr[x] = Timedfn;
}
inline int Dist(int x, int y) {
  if (!x || !y) return 0;
  return dpt[x] + dpt[y] - (dpt[LCA(x, y)] << 1);
}
struct data {
  int x, y, d;
  int get() { return d; }
};
data operator+(data A, data B) {
  static data Ans;
  static int dd;
  Ans = A;
  if (B.d > A.d) Ans = B;
  if (!B.x && !B.y) Ans = A;
  if (!A.x && !A.y) Ans = B;
  if ((dd = Dist(A.x, B.x)) > Ans.d) Ans.x = A.x, Ans.y = B.x, Ans.d = dd;
  if ((dd = Dist(A.x, B.y)) > Ans.d) Ans.x = A.x, Ans.y = B.y, Ans.d = dd;
  if ((dd = Dist(A.y, B.x)) > Ans.d) Ans.x = A.y, Ans.y = B.x, Ans.d = dd;
  if ((dd = Dist(A.y, B.y)) > Ans.d) Ans.x = A.y, Ans.y = B.y, Ans.d = dd;
  return Ans;
}
data f0[N << 2], f1[N << 2];
bool rev[N << 2];
inline void up(int o) {
  f1[o] = f1[o << 1] + f1[o << 1 | 1], f0[o] = f0[o << 1] + f0[o << 1 | 1];
}
inline void Build(int o, int l, int r) {
  if (l == r) {
    if (val[node[l]])
      f1[o].x = node[l];
    else
      f0[o].x = node[l];
    return;
  }
  int mid = l + r >> 1;
  Build(o << 1, l, mid), Build(o << 1 | 1, mid + 1, r), up(o);
}
inline void Rev(int o) { rev[o] ^= 1, swap(f0[o], f1[o]); }
inline void down(int o) {
  if (rev[o]) rev[o] = 0, Rev(o << 1), Rev(o << 1 | 1);
}
int ll, rr;
inline void Modify(int o, int l, int r) {
  if (ll <= l && rr >= r) {
    Rev(o);
    return;
  }
  down(o);
  int mid = l + r >> 1;
  if (ll <= mid) Modify(o << 1, l, mid);
  if (rr > mid) Modify(o << 1 | 1, mid + 1, r);
  up(o);
}
int main() {
  int i, j;
  read(n);
  for (i = 1; i < n; ++i)
    read(ex[i]), read(ey[i]), read(ez[i]), G[ex[i]].push_back(i),
        G[ey[i]].push_back(i);
  dfs(1);
  for (i = 1; i <= Timest; ++i) {
    Log[i] = Log[i - 1];
    while ((1 << Log[i] + 1) < i) ++Log[i];
  }
  for (j = 1; j <= Log[Timest]; ++j)
    for (i = 1; i + (1 << j) - 1 <= Timest; ++i)
      st[i][j] = Mn(st[i][j - 1], st[i + (1 << j - 1)][j - 1]);
  Build(1, 1, n);
  for (i = 1; i < n; ++i)
    if (fa[ey[i]] == ex[i]) swap(ey[i], ex[i]);
  int q, z;
  read(q);
  while (q--) {
    read(z), ll = tl[ex[z]], rr = tr[ex[z]], Modify(1, 1, n);
    cout << max(f1[1].get(), f0[1].get()) << '\n';
  }
  return 0;
}
