/** * Author: AcFunction * Date: 2019-08-25 13:51:34 * Email: 3486942970@qq.com **/ #include #define ll long long #define db double #define PII pair #define pb push_back #define fi first #define se second using namespace std; const int N = 500200; int T; int n, fa[N], pre[N], suf[N], num[N], ans[N]; int key[N], m; int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); } struct Edge { int u, v, w, id; bool operator < (const Edge &x) const { return w < x.w; } } E[N]; int main() { scanf("%d", &T); while(T--) { int cnt = 0; scanf("%d %d", &n, &m); for(int i = 1; i <= 2 * n; i++) fa[i] = i, pre[i] = 0, suf[i] = 0, num[i] = 0; for(int i = 1; i <= m; i++) { scanf("%d %d %d", &E[i].u, &E[i].v, &E[i].w); key[++cnt] = E[i].w; E[i].id = i; } sort(key + 1, key + cnt + 1); cnt = unique(key + 1, key + cnt + 1) - key - 1; for(int i = 1; i <= m; i++) { E[i].w = lower_bound(key + 1, key + cnt + 1, E[i].w) - key; } sort(E + 1, E + m + 1); for(int i = 1; i <= m; i++) { int u = E[i].u, v = E[i].v, w = E[i].w; int fu = find(u), fv = find(v); if(fu == fv) continue ; num[E[i].w]++; fa[fu] = fv; } for(int i = 1; i <= cnt; i++) pre[i] = pre[i - 1] + num[i]; for(int i = 1; i <= cnt; i++) num[i] = 0; for(int i = 1; i <= n; i++) fa[i] = i; for(int i = m; i >= 1; i--) { int u = E[i].u, v = E[i].v, w = E[i].w; int fu = find(u), fv = find(v); if(fu == fv) continue ; num[E[i].w]++; fa[fu] = fv; } for(int i = cnt; i >= 1; i--) suf[i] = suf[i + 1] + num[i]; for(int i = 1; i <= m; i++) { if(pre[E[i].w] >= n / 2 && n - suf[E[i].w] <= n / 2) { ans[E[i].id] = 1; } else ans[E[i].id] = 0; } for(int i = 1; i <= m; i++) printf("%d", ans[i]); printf("\n"); } return 0; }