#include<stdio.h>
#include<stdlib.h>
typedef enum{false,true} bool;
typedef struct TNode* Tree;
struct TNode {
char Data;
int Left;
int Right;};
Tree newTree(int N, int* r);
bool Judge(Tree T1, Tree T2, int r1, int r2);
int main(){
int N1,N2;//number of TNode
int r1=-1, r2=-1;//root of Treescanf("%d",&N1);
Tree T1=newTree(N1,&r1);scanf("%d",&N2);
Tree T2=newTree(N2,&r2);if(Judge(T1,T2, r1, r2))printf("Yes");elseprintf("No");return0;}
Tree newTree(int N,int* r){if(!N)returnNULL;
Tree T=(Tree)malloc(10*sizeof(struct TNode));
char tleft, tright, tdata;
int i;
int check[10]={0};for(i =0; i <N; i++){getchar();scanf("%c %c %c",&tdata,&tleft,&tright);T[i].Data = tdata;if(tleft =='-')T[i].Left =-1;else{T[i].Left = tleft -'0';
check[T[i].Left]=1;}if(tright =='-')T[i].Right =-1;else{T[i].Right = tright -'0';
check[T[i].Right]=1;}}for(i =0; i <N; i++){if(!check[i])break;}*r = i;returnT;}
bool Judge(Tree T1, Tree T2, int r1, int r2){if(r1 ==-1&& r2 ==-1)returntrue;if(r1 ==-1&& r2 !=-1|| r1 !=-1&& r2 ==-1)returnfalse;if(T1[r1].Data !=T2[r2].Data)returnfalse;if(T1[r1].Left ==-1&&T2[r2].Left ==-1)returnJudge(T1,T2,T1[r1].Right,T2[r2].Right);elseif(T1[r1].Left!=-1&&T2[r2].Left!=-1&&T1[T1[r1].Left].Data==T2[T2[r2].Left].Data)returnJudge(T1,T2,T1[r1].Right,T2[r2].Right);elsereturnJudge(T1,T2,T1[r1].Left,T2[r2].Right)&&Judge(T1,T2,T1[r1].Right,T2[r2].Left);}