#!/usr/bin/env python3

(n, m), reduce, comb = map(int, input().split()), __import__("functools").reduce, __import__("math").comb
if not all(c == "0" for c in bin(n)[3:]) or m != (dims := len(bin(n)[3:])) * n // 2: exit(print("no"))
es, nn, ns, seen, level, next_level, count = [[] for _ in range(n + 1)], {1: 1}, {1}, {1}, [1], [], 0
for a, b in (map(int, input().split()) for _ in range(m)): (es[a].append(b), es[b].append(a))
if not all(len(es[i]) == dims for i in range(1, n + 1)): exit(print("no"))
while level:
    (level := {neigh for curr in level for neigh in es[curr] if neigh not in seen}), seen.update(level)
    if (l := len(level)) != comb(dims, count := count + 1): exit(print("no"))
    if count == 1:
        nn.update({a: 2 << i for i, a in enumerate(level)}), ns.update({2 << i for i in range(l)})
    else:
        for node in level:
            if (new := reduce(lambda a, b: a | b, (nn[c] for c in es[node] if c in nn), 0)) in ns: exit(print("no"))
            nn.update({node: new}), ns.add(new)
print("yes")
