class TreeNode {
int left;
int right;
String value;
}
public class Main {
private static final int MAX_SIZE = 10;
public static void main(String[] args) {
TreeNode[] t1 = new TreeNode[MAX_SIZE];
TreeNode[] t2 = new TreeNode[MAX_SIZE];
int root1 = buildTree(t1);
int root2 = buildTree(t2);
System.out.println(isomorphism(root1, root2, t1, t2) ? "Yes":"No");
}
public static int buildTree(TreeNode[] t) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
boolean check[] = new boolean[n];
for(int i = 0; i < n; i++) {
String index = sc.next();
String sl = sc.next();
String sr = sc.next();
TreeNode node = new TreeNode();
node.value = index;
if(sl.equals("-")) {
node.left = -1;
}else {
node.left = Integer.parseInt(sl);
check[node.left] = true;
}
if(sr.equals("-")) {
node.right = -1;
}else {
node.right = Integer.parseInt(sr);
check[node.right] = true;
}
t[i] = node;
}
int Root = 0;
for(int i = 0; i < check.length; i++) {
if(!check[i]) {
Root = i; break;
}
}
return Root;
}
public static boolean isomorphism(int tt1, int tt2, TreeNode[] t1, TreeNode[] t2) {
if(tt1 == -1 && tt2 == -1)
return true;
else if((tt1 == -1 && tt2 != -1) || (tt1 != -1 && tt2 == -1))
return false;
else if(t1[tt1].value != t2[tt2].value)
return false;
else if(t1[tt1].left == -1 && t2[tt2].left == -1) {
return isomorphism(t1[tt1].right, t2[tt2].right, t1, t2);
}else if((t1[tt1].left != -1 && t2[tt2].left != -1) && (t1[t1[tt1].left].value == t2[t2[tt2].left].value)) {
return isomorphism(t1[tt1].left, t2[tt2].left, t1, t2)&&
isomorphism(t1[tt1].right, t2[tt2].right, t1, t2);
}else {
return isomorphism(t1[tt1].left, t2[tt2].right, t1, t2)&&
isomorphism(t1[tt1].right, t2[tt2].left, t1, t2);
}
}
}