#include <iostream>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <sstream>
#include <queue>
#include <vector>
#include <map>
#include <unordered_map>
#include <set> // multi可重复, lower_bound()返回的是第一个大于等于x的迭代器,若没有,返回end();
using namespace std;
/* Week = (d+2m+3(m+1)/5+y+y/4-y/100+y/400+1)%7 */
/* P(AUB)=P(A)+P(B)-P(AB) 任意事件概率的加法公式 */
/* A(mn) = n!/(n-m)! C(mn) = A(mn)/m!; 排列组合 */
/* (x[2]-x[1])*(y[3]-y[2]) - (y[2]-y[1])*(x[3]-x[2]); 判断3个点的顺逆 */
typedef long long ll;
struct node{
int var;
node *L = NULL, *R = NULL;
};
int n, root;
int r, d, e;
map<int, node*> mp;
void insert(node *&p, int r, int d, int e){
if(p == NULL){
p = new node();
p->var = e;
mp[e] = p; // map存当前值的地址,方便下次能直接跑
return ;
}
if(p->var == r){
if(d == 0){
insert(p->L, r, d, e);
}
else{
insert(p->R, r, d, e);
}
}
}
bool flag = true;
void dfs(node *p){
if(p->L != NULL){
if(p->L->var > p->var)flag = false;
dfs(p->L);
}
cout << p->var << endl;
if(p->R != NULL){
if(p->R->var < p->var)flag = false;
dfs(p->R);
}
}
int main(){
ios::sync_with_stdio(false);
node *p = NULL;
cin >> n;
if(n == 0){
cout << "Yes\n";
return 0;//恶心人
}
cin >> root;
insert(p,0,0,root);
for(int i = 1; i < n; i ++){
cin >> r >> d >> e;
insert(mp[r], r, d, e);
}
dfs(p);
if(flag == true)cout << "Yes\n";
else cout << "No\n";
return 0;
}