class Edge:
    b = 0
    c = 0

    def __init__(self, _b, _c):
        self.b = _b
        self.c = _c

class Node:
    edges = 0
    visited = False
    firstVisit = False
    idx = 0

    def __init__(self, _idx):
        self.idx = _idx
        self.edges = []

n, m = [int(x) for x in input().split()]
nodes = []

for i in range(n):
    nodes.append(Node(i))

stack = []

def traverse(node):
    node.firstVisit = True
    if (node.visited):
        r, b = 0, 0
        i = len(stack)-1
        lastNode = node
        while True:
            newNode = stack[i]
            i -= 1
            for e in lastNode.edges:
                if not (e.b == newNode.idx):
                    continue;
                if (e.c == 0):
                    b += 1
                else:
                    r += 1
            if (b >= 2 and r >= 2):
                return
            lastNode = stack[i+1]
            if (newNode.idx == node.idx):
                if (r == 1 or b == 1):
                    print("NO")
                    exit()
                else:
                    return

    node.visited = True
    stack.append(node)

    for e in node.edges:
        traverse(nodes[e.b])

    stack.pop(-1)
    node.visited = False

for i in range(m):
    a, b, c = [int(x) for x in input().split()]
    nodes[a].edges.append(Edge(b, c))
    nodes[b].edges.append(Edge(a, c))

for i in range(len(nodes)):
    if not nodes[i].firstVisit:
        traverse(nodes[i])

print("YES")
