Problem: Vasya has an array a_1, a_2, ..., a_n.

You don't know this array, but he told you m facts about this array. The i-th fact is a triple of numbers t_i, l_i and r_i (0 ≤ t_i ≤ 1, 1 ≤ l_i < r_i ≤ n) and it means:

  * if t_i=1 then subbarray a_{l_i}, a_{l_i + 1}, ..., a_{r_i} is sorted in non-decreasing order; 
  * if t_i=0 then subbarray a_{l_i}, a_{l_i + 1}, ..., a_{r_i} is not sorted in non-decreasing order. A subarray is not sorted if there is at least one pair of consecutive elements in this subarray such that the former is greater than the latter. 



For example if a = [2, 1, 1, 3, 2] then he could give you three facts: t_1=1, l_1=2, r_1=4 (the subarray [a_2, a_3, a_4] = [1, 1, 3] is sorted), t_2=0, l_2=4, r_2=5 (the subarray [a_4, a_5] = [3, 2] is not sorted), and t_3=0, l_3=3, r_3=5 (the subarray [a_3, a_5] = [1, 3, 2] is not sorted).

You don't know the array a. Find any array which satisfies all the given facts.

Input

The first line contains two integers n and m (2 ≤ n ≤ 1000, 1 ≤ m ≤ 1000).

Each of the next m lines contains three integers t_i, l_i and r_i (0 ≤ t_i ≤ 1, 1 ≤ l_i < r_i ≤ n).

If t_i = 1 then subbarray a_{l_i}, a_{l_i + 1}, ... , a_{r_i} is sorted. Otherwise (if t_i = 0) subbarray a_{l_i}, a_{l_i + 1}, ... , a_{r_i} is not sorted.

Output

If there is no array that satisfies these facts in only line print NO (in any letter case).

If there is a solution, print YES (in any letter case). In second line print n integers a_1, a_2, ..., a_n (1 ≤ a_i ≤ 10^9) — the array a, satisfying all the given facts. If there are multiple satisfying arrays you can print any of them.

Examples

Input


7 4
1 1 3
1 2 5
0 5 6
1 6 7


Output


YES
1 2 2 3 5 4 4


Input


4 2
1 1 4
0 2 3


Output


NO

Solution (in PYTHON3):

Solution:
import sys

zz=1
 
sys.setrecursionlimit(10**5)
if zz:
	input=sys.stdin.readline
else:	
	sys.stdin=open('input.txt', 'r')
	sys.stdout=open('all.txt','w')
di=[[-1,0],[1,0],[0,1],[0,-1]]

def fori(n):
	return [fi() for i in range(n)]	
def inc(d,c,x=1):
	d[c]=d[c]+x if c in d else x
def ii():
	return input().rstrip()	
def li():
	return [int(xx) for xx in input().split()]
def fli():
	return [float(x) for x in input().split()]	
def comp(a,b):
	if(a>b):
		return 2
	return 2 if a==b else 0		
def gi():	
	return [xx for xx in input().split()]
def gtc(tc,ans):
	print("Case #"+str(tc)+":",ans)	
def cil(n,m):
	return n//m+int(n%m>0)	
def fi():
	return int(input())
def pro(a): 
	return reduce(lambda a,b:a*b,a)		
def swap(a,i,j): 
	a[i],a[j]=a[j],a[i]	
def si():
	return list(input().rstrip())	
def mi():
	return 	map(int,input().split())			
def gh():
	sys.stdout.flush()
def isvalid(i,j,n,m):
	return 0<=i<n and 0<=j<m 
def bo(i):
	return ord(i)-ord('a')	
def graph(n,m):
	for i in range(m):
		x,y=mi()
		a[x].append(y)
		a[y].append(x)


t=1
uu=t
def find(i):
	if i==a[i]:
		return i
	a[i]=find(a[i])
	return a[i]
def union(x,y):
	xs,ys=find(x),find(y)
	if xs!=ys:
		if rank[ys]>rank[xs]:
			xs,ys=ys,xs
		a[ys]=xs
		rank[xs]+=1

while t>0:
	t-=1
	n,m=mi()
	a=[]
	b=[]
	for i in range(m):
		typ,l,r=mi()
		if typ==1:
			a.append([l,r])
		else:
			b.append([l,r])
	a.sort()
	d=[]
	l=r=-1
	for i in range(len(a)):
		if i==0:
			l=a[i][0]
			r=a[i][1]
		else:
			if a[i][0]>r:
				d.append([l,r])	
				l=a[i][0]
				r=a[i][1]
			else:
				r=max(r,a[i][1])
	if l!=-1 and r!=-1:			
		d.append([l,r])

	ans=[0]*(n+1)
	rank=[0]*(n+1)
	c=n*n+1
	a=[i for i in range(n+1)]
	for i,j in d:
		for l in range(i,j+1):
			ans[l]=c
			if l>i:
				union(l,l-1)
		c-=n+1
	for i in range(1,n+1):
		a[i]=find(i)
	for i,j in b:
		if find(i)==find(j):
			print("NO")
			exit(0)	
	print("YES")	

	if ans.count(0)==len(ans):
		for i in range(1,n+1):
			ans[i]=c
			c-=n-1
	else:
		p=ans.index(n*n+1)
		for j in range(p-1,-1,-1):
			if ans[j]==0:
				ans[j]=ans[j+1]+1	
		for j in range(p+1,n+1):
			if ans[j]==0:
				ans[j]=ans[j-1]-1
	print(*ans[1:])