int main() { freopen("input.txt", "r", stdin); scanf("%d%d%d", &n, &s, &m); for (int i = 1; i <= s; i++) { int x; scanf("%d", &x); w[x] = true; } for (int i = 1; i <= m; i++) { scanf("%d%d%d", &r[i].x, &r[i].y, &r[i].c); addedge(r[i].x, r[i].y, r[i].c); } dijkstra(); t = 0; std::fill(h + 1, h + n + 1, 0); std::fill(fa + 1, fa + s + 1, 0); for (int i = 1; i <= m; i++) { tree[i] = (Road){c[r[i].x], c[r[i].y], d[r[i].x] + d[r[i].y] + r[i].c}; } std::sort(tree + 1, tree + m + 1); for (int i = 1; i <= m; i++) { int fx = getfa(tree[i].x), fy = getfa(tree[i].y); if (fx == fy) continue; addedge(tree[i].x, tree[i].y, tree[i].c); fa[fx] = fy; } std::fill(v + 1, v + n + 1, false); for (int i = 1; i <= s; i++) if (!v[i]) buildtree(i); scanf("%d", &q); for (int cs = 1; cs <= q; cs++) { int x, y, d; scanf("%d%d%d", &x, &y, &d); x = c[x]; y = c[y]; if (getfa(x) != getfa(y)) { puts("NIE"); continue; } int l = getLca(x, y); long long vmax = -INF; vmax = std::max(vmax, getValue(x, dep[x] - dep[l])); vmax = std::max(vmax, getValue(y, dep[y] - dep[l])); printf("%s\n", (vmax <= d) ? "TAK" : "NIE"); } return 0; }
int main() { scanf("%d%d", &n, &m); for (int i = 0, a, b; i < n-1; i++) { scanf("%d%d", &a, &b); adjList[a].push_back(b); adjList[b].push_back(a); } ancestors[0][0] = 0; setOrders(0); for (int lvl = 1; lvl < 19; lvl++) for (int i = 0; i < n; i++) ancestors[i][lvl] = ancestors[ ancestors[i][lvl-1] ][lvl - 1]; int a, b, k; while (m--) { scanf("%d%d%d", &a, &b, &k); if (isAncestor(a, b)) { traffic[a] += k; traffic[b] -= k; } else if (isAncestor(b, a)) { traffic[b] += k; traffic[a] -= k; } else { traffic[a] += k; traffic[b] += k; traffic[getLca(a, b)] -= 2*k; } } setMaxTraffic(0); printf("%lld\n", maxTraffic); return 0; }