#include<bits/stdc++.h>
using namespace std;
typedef vector<char> vec;
typedef vector<vec> mat;
typedef long long ll;
ll mod=1e9+7;

struct UnionFind{
  vector<int> par,size;
  void init(int n){
    par.resize(n);
    size.resize(n);
    for(int i=0;i<n;i++){
      par[i]=i;
      size[i]=1;
    }
  }
  int find(int x){
    if(par[x]==x)return x;
    return par[x]=find(par[x]);
  }
  bool same(int x,int y){
    return ( find(x)==find(y) );
  }
  void unite(int x,int y){
    x=find(x);
    y=find(y);
    if(x==y)return;
    if(x<y)swap(x,y);
    par[x]=y;
  }
};

UnionFind T,U;
mat t,u;


int dy[]={-1,0,1,0, -1,1,-1,1};
int dx[]={0,1,0,-1, -1,1,1,-1};

void input(mat &t,UnionFind &T,int H,int W){
  t=mat(H,vec(W,'.') );
  T.init(H*W);

  
  for(int i=1;i<H-1;i++)
    for(int j=1;j<W-1;j++)
      cin>>t[i][j];
  T.init(H*W);
  
  for(int i=0;i<H;i++){
    for(int j=0;j<W;j++){
      int k=4;
      if(t[i][j]=='#')k+=4;
      for(int dir=0;dir<k;dir++){
        int ny=i+dy[dir];
        int nx=j+dx[dir];
        if(ny<0||H<=ny||nx<0||W<=nx)continue;
        if(t[i][j]==t[ny][nx])T.unite( i*W+j , ny*W+nx );
      }
    }// j
  }// i
}

map<int,bool> visited;

bool dfs(mat &t,UnionFind &T,int p,int q){
  int H=t.size(),W=t[0].size();
  int y=p/W,x=p%W;
  
  //  cout<<p<<' ';                           /////////////////////////////////////////////
  
  if(T.same(p,q))return true;
  if(visited[p])return true;
  if(y==0||x==0||y==H-1||x==W-1)return false;
  visited[p]=true;
  
  for(int i=0;i<4;i++){
    int ny=y+dy[i];
    int nx=x+dx[i];
    if(ny<0||nx<0||H<=ny||W<=nx)continue;
    if( !dfs(t,T,ny*W+nx,q) )return false;
  }
  return true;
}

bool check(mat &t,UnionFind &T,int I,int J){
  visited.clear();
  return dfs(t,T,I,J);
}

string calc(map< int , vector<int> > &G,int pos,int prev){
  vector<string> v;
  for(int i=0;i<(int)G[pos].size();i++){
    int to=G[pos][i];
    if(to==prev)continue;
    v.push_back( calc(G,to,pos) );
  }
  sort(v.begin(),v.end());
  
  string res="(";
  for(int i=0;i<(int)v.size();i++)
    res+=v[i];
  res.push_back(')');
  return res;
}

string getHash(mat &t,UnionFind &T){
  map< int , vector<int> > G;
  int H=t.size(), W=t[0].size();

  /*  
  for(int i=0;i<H;i++){
    for(int j=0;j<W;j++){
      printf("%3d", T.find(i*W+j) );
    }
    cout<<endl;
  }
  cout<<endl;
  */
  
  map< int, map<int,bool> > mp;
  for(int i=0;i<H;i++){
    for(int j=0;j<W;j++){
      for(int k=0;k<4;k++){
        int ny=i+dy[k];
        int nx=j+dx[k];
        if(ny<0||nx<0||H<=ny||W<=nx)continue;
        if(t[i][j]==t[ny][nx])continue;
        int a=i*W+j,b=ny*W+nx;
        a=T.find(a);b=T.find(b);

        
        if( T.same(a,b) )continue;
        if( mp[a][b] )continue;
        /*
        cout<<a<<' '<<b<<endl;
        cout<<a/W<<' '<<a%W<<endl;
        cout<<b/W<<' '<<b%W<<endl;
        cout<<"----"<<endl;
        */
        bool flg=check(t,T,a,b);
        /*
        cout<<endl;
        cout<<"-----------"<<endl;
        */
        mp[a][b]=true;
        if(flg){
          G[b].push_back(a);
        }
      }
    }
  }
  
  string res=calc(G,0,-1);
  //  cout<<res<<endl;
  return res;
}

int main(){
  while(1){
    int H,W;
    scanf("%d %d",&H,&W);
    if(H==0&&W==0)break;
    input(t,T,H+2,W+2);
    scanf("%d %d",&H,&W);
    input(u,U,H+2,W+2);
    if(getHash(t,T)==getHash(u,U))printf("yes\n");
    else printf("no\n");
  }
  return 0;
}

Measured memory_bytes: 4520