#include <bits/stdc++.h>
using namespace std;
const int N = 500005;
int n, m;
vector<pair<int, int>> g[N];
int eu[N], ev[N], et[N];
int in[N], out[N], rin[N], dfst;
int val[N], lvl[N];
void dfs(int u, int p) {
  in[u] = ++dfst;
  rin[in[u]] = u;
  for (auto [v, w] : g[u])
    if (v != p) {
      val[v] = val[u] ^ w;
      lvl[v] = lvl[u] + 1;
      dfs(v, u);
    }
  out[u] = dfst;
}
int dist[N];
int bfs(int st) {
  for (int i = 1; i <= n; i++) dist[i] = -1;
  queue<int> q;
  q.push(st);
  dist[st] = 0;
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    if (dist[u] > dist[st]) st = u;
    for (auto [v, w] : g[u])
      if (dist[v] == -1) {
        dist[v] = dist[u] + 1;
        q.push(v);
      }
  }
  return st;
}
int st[4 * N][2];
int lz[4 * N];
void prop(int p, int L, int R) {
  if (lz[p]) {
    swap(st[p][0], st[p][1]);
    if (L < R) {
      lz[2 * p] ^= 1;
      lz[2 * p + 1] ^= 1;
    }
    lz[p] = 0;
  }
}
void upd(int p, int L, int R, int i, int j) {
  prop(p, L, R);
  if (i > R or j < L) return;
  if (L >= i and R <= j) {
    lz[p] = 1;
    prop(p, L, R);
    return;
  }
  int mid = (L + R) / 2;
  upd(2 * p, L, mid, i, j);
  upd(2 * p + 1, mid + 1, R, i, j);
  st[p][0] = max(st[2 * p][0], st[2 * p + 1][0]);
  st[p][1] = max(st[2 * p][1], st[2 * p + 1][1]);
}
void build(int p, int L, int R) {
  lz[p] = 0;
  if (L == R) {
    int u = rin[L];
    st[p][1 - val[u]] = 0;
    st[p][val[u]] = lvl[u];
    return;
  }
  int mid = (L + R) / 2;
  build(2 * p, L, mid);
  build(2 * p + 1, mid + 1, R);
  st[p][0] = max(st[2 * p][0], st[2 * p + 1][0]);
  st[p][1] = max(st[2 * p][1], st[2 * p + 1][1]);
}
void print(int p, int L, int R) {
  prop(p, L, R);
  printf("[%d %d] = {%d %d}\n", L, R, st[p][0], st[p][1]);
  if (L == R) return;
  int mid = (L + R) / 2;
  print(2 * p, L, mid);
  print(2 * p + 1, mid + 1, R);
}
int mid[N];
int ans[N];
int main() {
  scanf("%d", &n);
  for (int i = 1; i < n; i++) {
    scanf("%d %d %d", eu + i, ev + i, et + i);
    g[eu[i]].emplace_back(ev[i], et[i]);
    g[ev[i]].emplace_back(eu[i], et[i]);
  }
  int sa = bfs(1);
  int sb = bfs(sa);
  lvl[sa] = val[sa] = 0;
  dfst = 0;
  dfs(sa, sa);
  build(1, 1, n);
  scanf("%d", &m);
  for (int j = 0; j < m; j++) {
    scanf("%d", mid + j);
    int i = mid[j];
    int u = lvl[eu[i]] < lvl[ev[i]] ? ev[i] : eu[i];
    upd(1, 1, n, in[u], out[u]);
    ans[j] = st[1][0];
  }
  lvl[sb] = val[sb] = 0;
  dfst = 0;
  dfs(sb, sb);
  build(1, 1, n);
  for (int j = 0; j < m; j++) {
    int i = mid[j];
    int u = lvl[eu[i]] < lvl[ev[i]] ? ev[i] : eu[i];
    upd(1, 1, n, in[u], out[u]);
    printf("%d\n", max(ans[j], st[1][0]));
  }
}
