//03-树1 树的同构 import java.util.Scanner;classnode{
String zimu;
int left;
int right;}publicclassMain{
final static int Max_Size =10;static node[]Read(Scanner s){
node[]T=newnode[Max_Size +1];
int n =0;
n = s.nextInt();
String x, y;for(int i =0; i < n; i ++){T[i]=newnode();T[i].zimu = s.next();
x = s.next();
y = s.next();if(!x.equals("-")){T[i].left = Integer.parseInt(x);}else{T[i].left =-1;}if(!y.equals("-")){T[i].right = Integer.parseInt(y);}else{T[i].right =-1;}}returnT;}static int check(node[]T, int n){
int[] a =newint[n];
int p =-1;for(int i =0; i < n; i ++){if(T[i].left !=-1){
a[T[i].left]=1;}if(T[i].right !=-1){
a[T[i].right]=1;}}for(int i =0; i < n; i ++){if(a[i]==0){
p = i;break;}}return p;}static boolean isomorphism(node[]T1, int R1, node[]T2, int R2){if(R1==-1&&R2==-1)returntrue;//一个空,一个不空if(R1==-1&&R2!=-1||R1!=-1&&R2==-1)returnfalse;//根节点不相等if(!(T1[R1].zimu.equals(T2[R2].zimu))){returnfalse;}//如果树1.左和树2.左都空,只要比较树1.右和树2.右if((T1[R1].left ==-1)&&(T2[R2].left ==-1))returnisomorphism(T1,T1[R1].right,T2,T2[R2].right);//如果树1.左和树2.左都不空,并且值相等,那么比较树1.左和树2.左 && 树1.右和树2.右if(((T1[R1].left !=-1)&&(T2[R2].left !=-1))&&(T1[T1[R1].left].zimu.equals(T2[T2[R2].left].zimu))){returnisomorphism(T1,T1[R1].left,T2,T2[R2].left)&&isomorphism(T1,T1[R1].right,T2,T2[R2].right);}else{//否则比较 树1.左和树2.右 && 树1.右和树2.左returnisomorphism(T1,T1[R1].left,T2,T2[R2].right)&&isomorphism(T1,T1[R1].right,T2,T2[R2].left);}}static String getType(Object test){return test.getClass().getName().toString();}publicstaticvoidmain(String args[]){
Scanner s =newScanner(System.in);
node[]T1=newnode[Max_Size +1];
node[]T2=newnode[Max_Size +1];
int R1,R2;T1=Read(s);T2=Read(s);
s.close();
int n1 =0;while(T1[n1]!=null){
n1 ++;}R1=check(T1, n1);
int n2 =0;while(T2[n2]!=null){
n2 ++;}R2=check(T2, n2);//System.out.println(R1);//System.out.println(R2);if(isomorphism(T1,R1,T2,R2)){
System.out.print("Yes");}else{
System.out.print("No");}}}