#include<iostream>
#include<vector>
#include<string>
#include<queue>
using namespace std;
struct Node{
int id;
int left;
int right;
}node[21];
int getnum(string a){
if(a=="-") return -1;
else{
if(a.length()==1) return (a[0]-'0');
else{
return ((a[0]-'0')*10+(a[1]-'0'));
}
}
}
bool judge1(int root){
if(root==-1) return true;
queue<int> q;
q.push(root);
bool shouldbeleaf=false;
while(!q.empty()){
int now=q.front();
q.pop();
if(node[now].left==-1&&node[now].right!=-1) return false;
if(shouldbeleaf==true&&(node[now].left!=-1||node[now].right!=-1)) return false;
if(node[now].left!=-1) q.push(node[now].left);
if(node[now].right!=-1) q.push(node[now].right);
else shouldbeleaf=true;
}
}
vector<int> in;
void levetra(int root){
queue<int> q;
q.push(root);
while(!q.empty()){
int now=q.front();
q.pop();
in.push_back(now);
if(node[now].left!=-1) q.push(node[now].left);
if(node[now].right!=-1) q.push(node[now].right);
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int n;
cin>>n;
for(int i=0;i<n;i++){
string temp1,temp2;
cin>>temp1>>temp2;
int t1,t2;
t1=getnum(temp1);
t2=getnum(temp2);
node[i].id=i;
node[i].left=t1;
node[i].right=t2;
}
int root;
int flag[21]={};
for(int i=0;i<n;i++){
if(node[i].left!=-1) flag[node[i].left]=1;
if(node[i].right!=-1) flag[node[i].right]=1;
}
for(int i=0;i<n;i++){
if(flag[i]!=1){
root=i;break;
}
}
levetra(root);
if(judge1(root)==true) cout<<"YES "<<in[n-1]<<endl;
else cout<<"NO "<<in[0]<<endl;
return 0;
}