from collections import deque
class Node:
def __init__(self,elem:int):
self.elem=elem
self.next=None
def add_next(self,next_elem:'Node'):
self.next=next_elem
def return_elem(self):
return self.elem
def return_next(self):
return self.next
class graph:
def __init__(self,n:int,m:int):
self.node=n
self.edge=m
self.node_set=[]
for i in range(n):
self.node_set.append(Node(i+1))
def add_edge(self,start:int,end:int):
p=self.node_set[start-1]
while p.next!=None:
p=p.next
p.add_next(Node(end))
def return_node(self,index):
return self.node_set[index]
def bfs(graph: graph):
queue = deque()
queue.append(graph.return_node(0))
visited = set()
visited.add(graph.return_node(0).return_elem())
while queue:
current_node = queue.popleft()
current = current_node
while current.next != None:
neighbor = current.next
if neighbor.return_elem() not in visited:
visited.add(neighbor.return_elem())
queue.append(graph.return_node(neighbor.return_elem()-1))
current = current.next
return visited
if __name__ == "__main__":
while True:
try:
string=input().split()
n,m=int(string[0]),int(string[1])
gra=graph(n,m)
if m==0 and n==0:
break
for i in range(m):
string = input().split()
start, end = int(string[0]), int(string[1])
gra.add_edge(start,end)
#gra.print_next()
visited=bfs(gra)
if len(visited)!=n:
print("NO")
else:
print("YES")
except EOFError:
break