import std.algorithm, std.container, std.conv, std.math, std.range, std.typecons, std.stdio, std.string; auto rdsp(){return readln.splitter;} void pick(R,T)(ref R r,ref T t){t=r.front.to!T;r.popFront;} void readV(T...)(ref T t){auto r=rdsp;foreach(ref v;t)pick(r,v);} void readC(T...)(size_t n,ref T t){foreach(ref v;t)v=new typeof(v)(n);foreach(i;0..n){auto r=rdsp;foreach(ref v;t)pick(r,v[i]);}} void main() { int n, m, k; readV(n, m, k); int[] a, b, c; readC(m, a, b, c); --a[]; --b[]; int[] e; readC(k, e); --e[]; struct R { int a, b, c, i; } auto r = new R[](m); foreach (i; 0..m) r[i] = R(a[i], b[i], c[i], i); auto v = new bool[](n), uf = new UnionFind!int(n); foreach (ei; e) { uf.unite(r[ei].a, r[ei].b); v[ei] = true; } auto r2 = r.dup.sort!"a.c !l.empty); } }