#include <bits/stdc++.h>
using namespace std;
double getTime() { return clock() / (double)CLOCKS_PER_SEC; };
const int mod = 1e9 + 7;
const long long INF = 3e18;
const int N = 5e5 + 5;
const int P0 = 437;
const int P1 = 343;
const int d = 400;
const double PI = acos(-1);
vector<pair<int, int> > v[N];
int n, m, L[N], R[N], Q[N], dist[N], was[N], chet[N], Fi[N], La[N], Sz;
vector<int> el;
void dfs1(int pos) {
  for (auto x : v[pos]) {
    if (!dist[x.first]) {
      dist[x.first] = dist[pos] + 1;
      dfs1(x.first);
    }
  }
}
void dfs(int pos, int ch) {
  was[pos] = 1;
  chet[pos] = ch;
  Fi[pos] = ((int)(el).size());
  el.emplace_back(pos);
  for (auto y : v[pos]) {
    int x = y.first, t = y.second;
    if (was[x]) continue;
    dist[x] = dist[pos] + 1;
    dfs(x, ch ^ t);
  }
  La[pos] = ((int)(el).size());
  el.emplace_back(pos);
}
struct Tree {
  vector<int> mi, ma, g;
  Tree() {
    mi.resize(Sz * 4);
    ma.resize(Sz * 4);
    g.resize(Sz * 4);
  }
  void Init(int v, int L, int R) {
    if (R - L == 1) {
      mi[v] = ma[v] = dist[el[L]];
      if (chet[el[L]]) mi[v] = ma[v] = -dist[el[L]];
      return;
    }
    int c = (L + R) / 2;
    Init(v * 2, L, c);
    Init(v * 2 + 1, c, R);
    mi[v] = min(mi[v * 2], mi[v * 2 + 1]);
    ma[v] = max(ma[v * 2], ma[v * 2 + 1]);
  }
  void Push(int v) {
    if (!g[v]) return;
    swap(mi[v * 2], ma[v * 2]);
    mi[v * 2] = -mi[v * 2];
    ma[v * 2] = -ma[v * 2];
    swap(mi[v * 2 + 1], ma[v * 2 + 1]);
    mi[v * 2 + 1] = -mi[v * 2 + 1];
    ma[v * 2 + 1] = -ma[v * 2 + 1];
    g[v * 2] ^= 1;
    g[v * 2 + 1] ^= 1;
    g[v] = 0;
  }
  void Upd(int v, int L, int R, int l, int r) {
    if (L == l && R == r) {
      swap(mi[v], ma[v]);
      mi[v] = -mi[v];
      ma[v] = -ma[v];
      g[v] ^= 1;
      return;
    }
    Push(v);
    int c = (L + R) / 2;
    if (l < c) Upd(v * 2, L, c, l, min(r, c));
    if (c < r) Upd(v * 2 + 1, c, R, max(l, c), r);
    mi[v] = min(mi[v * 2], mi[v * 2 + 1]);
    ma[v] = max(ma[v * 2], ma[v * 2 + 1]);
  }
  int GetMa() { return ma[1]; }
};
vector<int> Get(int st) {
  for (int i = 0; i < (n); i++) {
    dist[i] = 0;
    was[i] = 0;
    chet[i] = 0;
    Fi[i] = 0;
    La[i] = 0;
  }
  el.clear();
  dfs(st, 0);
  Sz = ((int)(el).size());
  Tree T;
  T.Init(1, 0, Sz);
  vector<int> an(m);
  for (int h = 0; h < (m); h++) {
    int now = Q[h];
    now--;
    int from = L[now], to = R[now];
    if (dist[from] > dist[to]) swap(from, to);
    T.Upd(1, 0, Sz, Fi[to], La[to] + 1);
    an[h] = T.GetMa();
  }
  return an;
}
void solve() {
  cin >> n;
  for (int i = 0; i < (n - 1); i++) {
    int l, r, t;
    cin >> l >> r >> t;
    l--;
    r--;
    v[l].emplace_back(r, t);
    v[r].emplace_back(l, t);
    L[i] = l;
    R[i] = r;
  }
  cin >> m;
  for (int i = 0; i < (m); i++) cin >> Q[i];
  dist[0] = 1;
  dfs1(0);
  int first = 0;
  for (int i = 0; i < (n); i++)
    if (dist[i] > dist[first]) first = i;
  for (int i = 0; i < (n); i++) dist[i] = 0;
  dist[first] = 1;
  dfs1(first);
  int second = first;
  for (int i = 0; i < (n); i++)
    if (dist[i] > dist[second]) second = i;
  vector<int> an1 = Get(first), an2 = Get(second);
  for (int i = 0; i < (m); i++) cout << max(an1[i], an2[i]) << '\n';
}
signed main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int qq = 1;
  while (qq--) solve();
}
