A matrix B (consisting of integers) of dimension N × N is said to be good if there exists an array A (consisting of integers) such that B[i][j]  = |A[i] - A[j]|, where |x| denotes absolute value of integer x.
You are given a partially filled matrix B of dimension N × N. Q of the entries of this matrix are filled by either 0 or 1. You have to identify whether it is possible to fill the remaining entries of matrix B (the entries can be filled by any integer, not necessarily by 0 or 1) such that the resulting fully filled matrix B is good.

-----Input-----
The first line of the input contains an integer T denoting the number of test cases. 
The first line of each test case contains two space separated integers N, Q.
Each of the next Q lines contain three space separated integers i, j, val, which means that B[i][j] is filled with value val.

-----Output-----
For each test case, output "yes" or "no" (without quotes) in a single line corresponding to the answer of the problem.

-----Constraints-----
- 1 ≤ T ≤ 106
- 2 ≤ N ≤ 105
- 1 ≤ Q ≤ 106
- 1 ≤ i, j ≤ N
- 0 ≤ val ≤ 1
- Sum of each of N, Q over all test cases doesn't exceed 106

-----Subtasks-----
- Subtask #1 (40 points) 2 ≤ N ≤ 103, 1 ≤ Q ≤ 103, Sum of each of N, Q over all test cases doesn't exceed 104
- Subtask #2 (60 points) Original Constraints

-----Example-----
Input
4
2 2
1 1 0
1 2 1
2 3
1 1 0
1 2 1
2 1 0
3 2
2 2 0
2 3 1
3 3
1 2 1
2 3 1
1 3 1

Output
yes
no
yes
no

-----Explanation-----
Example 1. You can fill the entries of matrix B as follows. 

0 1
1 0
This matrix corresponds to the array A = [1, 2].

Example 2. It is impossible to fill the remaining entries of matrix B such that the resulting matrix is good, as B[1][2] = 1 and B[2][1] = 0, which is impossible.

```python

USER_FILENAME = "<user_code>"
import sys, json, builtins
import math, heapq, bisect, itertools, functools, collections, statistics, fractions, decimal, operator, array, random, re, string, os, pathlib
try:
    import resource as _res
except Exception:
    _res = None
from collections import Counter, defaultdict, deque, OrderedDict
from functools import lru_cache, reduce
from itertools import accumulate, permutations, combinations, product
from math import gcd, ceil, floor, sqrt
from decimal import Decimal
try:
    from typing import *
except Exception:
    pass
try:
    sys.setrecursionlimit(1_000_000)
except Exception:
    pass
try:
    import site as _site
    try:
        _sys_sites = _site.getsitepackages() if hasattr(_site, "getsitepackages") else []
        for _p in _sys_sites:
            if _p and _p not in sys.path:
                sys.path.append(_p)
    except Exception:
        pass
    try:
        _usp = _site.getusersitepackages()
        if isinstance(_usp, str):
            _usp = [_usp]
        for _p in _usp:
            if _p and _p not in sys.path:
                sys.path.append(_p)
    except Exception:
        pass
except Exception:
    pass

ns = {"__name__": "__main__"}
for _k, _v in list(globals().items()):
    if not _k.startswith("_"):
        ns[_k] = _v
_CODE = 'def union(a,b):\n fa=find(a)\n fb=find(b)\n if rank[fa]>rank[fb]:\n  dsu[fb]=fa\n elif rank[fb]>rank[fa]:\n  dsu[fa]=fb\n else:\n  rank[fa]+=1\n  dsu[fb]=fa\ndef find(x):\n while x!=dsu[x]:\n  dsu[x]=dsu[dsu[x]]\n  x=dsu[x]\n return x\nfor _ in range(int(input())):\n n,q=list(map(int,input().split()))\n dsu=[i for i in range(n)]\n rank=[0]*n\n ones=[]\n zeros=[]\n for i in range(q):\n  a,b,c=list(map(int,input().split()))\n  if c==1:\n   ones.append([a-1,b-1])\n  else:\n   zeros.append([a-1,b-1])\n flag=0\n for i in zeros:\n  f1=find(i[0])\n  f2=find(i[1])\n  union(i[0],i[1])\n color=[0]*n\n for i in ones:\n  f1=find(i[0])\n  f2=find(i[1])\n  if f1==f2:\n   flag=1\n  else:\n   #print(color)\n   if color[f1]==0 and color[f2]==0:\n    color[f1]=-1\n    color[f2]=1\n   elif color[f1]!=0 and color[f2]==0:\n    color[f2]=-color[f1]\n   elif color[f2]!=0 and color[f1]==0:\n    color[f1]=-color[f2]\n   elif color[f2]==color[f1]:\n    flag=1\n \n\n print("yes" if flag==0 else "no")\n'
_co = compile(_CODE, USER_FILENAME, "exec")
exec(_co, ns, ns)

```

Measured memory_bytes: 14085