#include <bits/stdc++.h>
using namespace std;
namespace IO {
char buf[1000000], *p1 = buf, *p2 = buf;
inline char gc() {
  if (p1 == p2) p2 = (p1 = buf) + fread(buf, 1, 1000000, stdin);
  return p1 == p2 ? EOF : *(p1++);
}
template <class T>
inline void read(T &n) {
  n = 0;
  register int ch = gc(), f;
  while ((ch < '0' || ch > '9') && ch != '-') ch = gc();
  f = (ch == '-' ? ch = gc(), -1 : 1);
  while (ch >= '0' && ch <= '9') n = n * 10 + (ch ^ 48), ch = gc();
  n *= f;
}
char Of[105], *O1 = Of, *O2 = Of;
template <class T>
inline void print(T n, char ch = '\n') {
  if (n < 0) putchar('-'), n = -n;
  if (n == 0) putchar('0');
  while (n) *(O1++) = (n % 10) ^ 48, n /= 10;
  while (O1 != O2) putchar(*(--O1));
  putchar(ch);
}
}  // namespace IO
using IO ::print;
using IO ::read;
int const MAXN = 5e5 + 5;
struct Edges {
  int to, next;
} e[MAXN << 1];
int head[MAXN], tot, n;
struct Edge {
  int x, y, z;
} E[MAXN];
struct Tree {
  int root;
  int mx0[MAXN << 2], mx1[MAXN << 2];
  int tag[MAXN << 2];
  int dis[MAXN], Dfn[MAXN], dfncnt, size[MAXN];
  int DDfn[MAXN];
  void Update(int x) {
    mx0[x] = max(mx0[(x << 1)], mx0[(x << 1 | 1)]);
    mx1[x] = max(mx1[(x << 1)], mx1[(x << 1 | 1)]);
  }
  void Reverse(int x) { swap(mx0[x], mx1[x]), tag[x] ^= 1; }
  void Pushdown(int x) { Reverse((x << 1)), Reverse((x << 1 | 1)), tag[x] = 0; }
  void Build(int x, int l, int r) {
    if (l == r) return mx0[x] = dis[DDfn[l]], void();
    int mid = (l + r) >> 1;
    Build((x << 1), l, mid);
    Build((x << 1 | 1), mid + 1, r);
    Update(x);
  }
  void Change(int x, int l, int r, int i, int j) {
    if (i <= l && r <= j) return Reverse(x);
    if (tag[x]) Pushdown(x);
    int mid = (l + r) >> 1;
    if (i <= mid) Change((x << 1), l, mid, i, j);
    if (j > mid) Change((x << 1 | 1), mid + 1, r, i, j);
    Update(x);
  }
  void Dfs(int now, int fa) {
    Dfn[now] = ++dfncnt;
    size[now] = 1;
    for (register int i = head[now]; i; i = e[i].next)
      if (e[i].to != fa) {
        dis[e[i].to] = dis[now] + 1;
        Dfs(e[i].to, now);
        size[now] += size[e[i].to];
      }
  }
  void Init() {
    Dfs(root, 0);
    for (register int i = 1; i <= n; ++i) DDfn[Dfn[i]] = i;
    Build(1, 1, n);
  }
  void Modify(int x, int y) {
    if (dis[y] > dis[x]) swap(x, y);
    Change(1, 1, n, Dfn[x], Dfn[x] + size[x] - 1);
  }
  int Query() { return mx0[1]; }
} S, T;
int mxdis;
inline void addedge(int from, int to) {
  e[++tot] = (Edges){to, head[from]};
  head[from] = tot;
  e[++tot] = (Edges){from, head[to]};
  head[to] = tot;
}
void Dfs(int now, int fa, int dis, int &node) {
  if (dis > mxdis) mxdis = dis, node = now;
  for (register int i = head[now]; i; i = e[i].next)
    if (e[i].to != fa) Dfs(e[i].to, now, dis + 1, node);
}
int main() {
  read(n);
  for (register int i = 1; i < n; ++i) {
    read(E[i].x), read(E[i].y), read(E[i].z);
    addedge(E[i].x, E[i].y);
  }
  mxdis = -1, Dfs(1, 0, 0, S.root);
  mxdis = -1, Dfs(S.root, 0, 0, T.root);
  S.Init(), T.Init();
  for (register int i = 1; i < n; ++i)
    if (E[i].z == 1) {
      S.Modify(E[i].x, E[i].y);
      T.Modify(E[i].x, E[i].y);
    }
  int m;
  read(m);
  while (m--) {
    int p;
    read(p);
    S.Modify(E[p].x, E[p].y);
    T.Modify(E[p].x, E[p].y);
    print(max(S.Query(), T.Query()));
  }
  return 0;
}
