Problem: An angel lives in the clouds above the city where Natsume lives. The angel, like Natsume, loves cats and often comes down to the ground to play with cats. To get down to the ground, the angel made a long, long staircase leading from the clouds to the ground. However, the angel thought that it would be boring to just go down every time, so he worked on the stairs so that he could make a sound when he stepped on the steps. Use this to get off while playing music.

Music is played using 12 kinds of sounds. This time, I will ignore the octave of the sound and consider only 12 types of C, C #, D, D #, E, F, F #, G, G #, A, A #, B. The difference between adjacent sounds is called a semitone. For example, raising C by a semitone gives C #, and raising C # by a semitone gives D. Conversely, lowering G by a semitone gives F #, and lowering F # by a semitone gives F. Note that raising E by a semitone results in F, and raising B by a semitone results in C.

The mechanism of sound output from the stairs is as follows. First, the stairs consist of n white boards floating in the air. One of the 12 tones is assigned to each of the 1st to nth boards counting from the clouds. Let's write this as Ti (i = 1 ... n). Also, for the sake of simplicity, consider the clouds as the 0th stage and the ground as the n + 1th stage (however, no scale is assigned to them). When the angel is in the k (k = 0 ... n) stage, the next step is to go to any of the k-1, k + 1, k + 2 stages that exist. However, it cannot move after descending to the n + 1th stage (ground), and cannot return to it after leaving the 0th stage (cloud). Each movement makes a sound according to the following rules.

I got down to the k + 1 stage
The sound of Tk + 1 sounds.
k + 2nd step
A semitone up of Tk + 2 sounds.
I returned to the k-1 stage
A semitone lower Tk-1 sounds.

Information on the stairs T1 ... Tn and the song S1 ... Sm that the angel wants to play are given. At this time, another sound must not be played before, during, or after the song you want to play. Determine if the angel can play this song and descend from the clouds to the ground.

Notes on Submission

Multiple datasets are given in the above format. The first line of input data gives the number of datasets. Create a program that outputs the output for each data set in order in the above format.



Input

The first line of input gives the number of steps n of the stairs and the length m of the song that the angel wants to play. The second line is the information of the stairs, and T1, T2, ..., Tn are given in this order. The third line is the song that the angel wants to play, and S1, S2, ..., Sm are given in this order. All of these are separated by a single space character and satisfy 1 <= n, m <= 50000.

Output

Output "Yes" if the angel can get down to the ground while playing the given song, otherwise output "No" on one line.

Example

Input

4
6 4
C E D# F G A
C E F G
6 4
C E D# F G A
C D# F G
3 6
C D D
D# B D B D# C#
8 8
C B B B B B F F
C B B B B B B B


Output

Yes
No
Yes
No

Solution (in CPP):

Solution:
#include <cstdio>  // {{{
#include <iostream>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <algorithm>

#define GET_MACRO(a, b, c, d, NAME, ...) NAME
#define REP(...) GET_MACRO(__VA_ARGS__, REP4, REP3, REP2)(__VA_ARGS__)
#define REP2(i, a) REP3(i, 0, a)
#define REP3(i, a, b) REP4(i, a, b, 1)
#define REP4(i, a, b, s) for (int i = (a); i < (int)(b); i += (s))
#define REPR(...) GET_MACRO(__VA_ARGS__, REPR4, REPR3, REPR2)(__VA_ARGS__)
#define REPR2(i, a) REPR3(i, 0, a)
#define REPR3(i, a, b) REPR4(i, a, b, 1)
#define REPR4(i, a, b, s) for (int i = (b)-1; i >= (int)(a); i -= (s))
#define ALL(c) (c).begin(), (c).end()

using Int = long long;
// clang-format off
template<typename T,typename U>inline bool chmax(T&x,U a){return x<a&&(x=a,1);}
template<typename T,typename U>inline bool chmin(T&x,U a){return a<x&&(x=a,1);}
inline signed in(){signed x;scanf("%d",&x);return x;}
// clang-format on
// }}}

using namespace std;

const int MOD = 12;

int getRank(string& s) {
  if (s == "C") return 0;
  if (s == "C#") return 1;
  if (s == "D") return 2;
  if (s == "D#") return 3;
  if (s == "E") return 4;
  if (s == "F") return 5;
  if (s == "F#") return 6;
  if (s == "G") return 7;
  if (s == "G#") return 8;
  if (s == "A") return 9;
  if (s == "A#") return 10;
  if (s == "B") return 11;
}

int N, M;
int rankT[50500];
int rankB[50500];

bool solve(int n, int m) {
  if (m == -1) return n == -1;
  if (n < 0) return false;
  if (rankT[n] == rankB[m]) {
    if (solve(n - 1, m - 1)) return true;
  }
  if ((rankT[n] + 1) % MOD == rankB[m]) {
    if (solve(n - 2, m - 1)) return true;
  }
  if ((rankT[n] + MOD - 1) % MOD == rankB[m]) {
    if (solve(n + 1, m - 1)) return true;
  }
  return false;
}

signed main() {
  int T = in();
  REP(t, T) {
    N = in(), M = in();
    REP(i, N) {
      string S;
      cin >> S;
      rankT[i] = getRank(S);
    }
    REP(i, M) {
      string S;
      cin >> S;
      rankB[i] = getRank(S);
    }
    if (solve(N - 1, M - 1) || solve(N - 2, M - 1)) {
      cout << "Yes" << endl;
    } else {
      cout << "No" << endl;
    }
  }
  return 0;
}