#include const int N = 100054, M = N * 2; struct edge { int u, v, w, id; edge * read(int _id) {return scanf("%d%d%d", &u, &v, &w), id = _id, this;} bool operator < (const edge &b) const {return w < b.w;} } e[M]; int V, E; int p[N]; char ans[M]; int ancestor(int x) {return p[x] == x ? x : (p[x] = ancestor(p[x]));} inline bool un(int x, int y) { if ((x = ancestor(x)) == (y = ancestor(y))) return true; return p[x] = y, false; } void work() { int i, u, v, w, Es, small, big; scanf("%d%d", &V, &E); for (i = 0; i < E; ++i) e[i].read(i); std::iota(p, p + (V + 1), 0), std::sort(e, e + E); for (Es = i = 0; i < E; ++i) if (!un(e[i].u, e[i].v)) if (++Es == V / 2) small = e[i].w; std::iota(p, p + (V + 1), 0), std::reverse(e, e + E); for (Es = i = 0; i < E; ++i) if (!un(e[i].u, e[i].v)) if (++Es == V / 2) big = e[i].w; for (i = 0; i < E; ++i) ans[e[i].id] = 48 + (small <= e[i].w && e[i].w <= big); ans[E] = 0, puts(ans); } int main() { int T; for (scanf("%d", &T); T; --T) work(); return 0; }