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 <bits/stdc++.h>
//typedef
//-------------------------#include <bits/stdc++.h>
 
const double pi = 3.141592653589793238462643383279;
 
 
using namespace std;
 
//conversion
//------------------------------------------
inline int toInt(string s) { int v; istringstream sin(s); sin >> v; return v; }
template<class T> inline string toString(T x) { ostringstream sout; sout << x; return sout.str(); }
inline int readInt() { int x; scanf("%d", &x); return x; }
 
//typedef
//------------------------------------------
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef vector<string> VS;
typedef pair<int, int> PII;
typedef pair<long long, long long> PLL;
typedef pair<int, PII> TIII;
typedef long long LL;
typedef unsigned long long ULL;
typedef vector<LL> VLL;
typedef vector<VLL> VVLL;
 
 
//container util
 
//------------------------------------------
#define ALL(a)  (a).begin(),(a).end()
#define RALL(a) (a).rbegin(), (a).rend()
#define PB push_back
#define MP make_pair
#define SZ(a) int((a).size())
#define SQ(a) ((a)*(a))
#define EACH(i,c) for(typeof((c).begin()) i=(c).begin(); i!=(c).end(); ++i)
#define EXIST(s,e) ((s).find(e)!=(s).end())
#define SORT(c) sort((c).begin(),(c).end())
 
 
//repetition
//------------------------------------------
#define FOR(i,s,n) for(int i=s;i<(int)n;++i)
#define REP(i,n) FOR(i,0,n)
#define MOD 998244353
 
#define rep(i, a, b) for(int i = a; i < (b); ++i)
#define trav(a, x) for(auto& a : x)
#define all(x) x.begin(), x.end()
#define sz(x) (int)(x).size()
 
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
const double EPS = 1E-8;
 
#define chmin(x,y) x=min(x,y)
#define chmax(x,y) x=max(x,y)
 
class UnionFind {
public:
    vector <int> par; 
    vector <int> siz; 

    UnionFind(int sz_): par(sz_), siz(sz_, 1) {
        for (ll i = 0; i < sz_; ++i) par[i] = i;
    }
    void init(int sz_) {
        par.resize(sz_);
        siz.assign(sz_, 1LL);
        for (ll i = 0; i < sz_; ++i) par[i] = i;
    }
 
    int root(int x) { 
        while (par[x] != x) {
            x = par[x] = par[par[x]];
        }
        return x;
    }
 
    bool merge(int x, int y) {
        x = root(x);
        y = root(y);
        if (x == y) return false;
        if (siz[x] < siz[y]) swap(x, y);
        siz[x] += siz[y];
        par[y] = x;
        return true;
    }
 
    bool issame(int x, int y) { 
        return root(x) == root(y);
    }
 
    int size(int x) { 
        return siz[root(x)];
    }
};
 
 
ll modPow(ll x, ll n, ll mod = MOD){
    ll res = 1;
    while(n){
        if(n&1) res = (res * x)%mod;
 
        res %= mod;
        x = x * x %mod;
        n >>= 1;
    }
    return res;
}
 
#define SIEVE_SIZE 5000000+10
bool sieve[SIEVE_SIZE];
void makeSieve(){
    for(int i=0; i<SIEVE_SIZE; ++i) sieve[i] = true;
    sieve[0] = sieve[1] = false;
    for(int i=2; i*i<SIEVE_SIZE; ++i) if(sieve[i]) for(int j=2; i*j<SIEVE_SIZE; ++j) sieve[i*j] = false;
}
 
bool isprime(ll n){
    if(n == 0 || n == 1) return false;
    for(ll i=2; i*i<=n; ++i) if(n%i==0) return false;
    return true;
}
 
const int MAX = 2000010;
long long fac[MAX], finv[MAX], inv[MAX];
 
// テーブルを作る前処理
void COMinit() {
    fac[0] = fac[1] = 1;
    finv[0] = finv[1] = 1;
    inv[1] = 1;
    for (int i = 2; i < MAX; i++){
        fac[i] = fac[i - 1] * i % MOD;
        inv[i] = MOD - inv[MOD%i] * (MOD / i) % MOD;
        finv[i] = finv[i - 1] * inv[i] % MOD;
    }
}
 
// 二項係数計算
long long COM(int n, int k){
    if (n < k) return 0;
    if (n < 0 || k < 0) return 0;
    return fac[n] * (finv[k] * finv[n - k] % MOD) % MOD;
}
 
long long extGCD(long long a, long long b, long long &x, long long &y) {
    if (b == 0) {
        x = 1;
        y = 0;
        return a;
    }
    long long d = extGCD(b, a%b, y, x);
    y -= a/b * x;
    return d;
}
// 負の数にも対応した mod (a = -11 とかでも OK) 
inline long long mod(long long a, long long m) {
    return (a % m + m) % m;
}
 
// 逆元計算 (ここでは a と m が互いに素であることが必要)
long long modinv(long long a, long long m) {
    long long x, y;
    extGCD(a, m, x, y);
    return mod(x, m); // 気持ち的には x % m だが、x が負かもしれないので
}
ll GCD(ll a, ll b){
    
    if(b == 0) return a;
    return GCD(b, a%b);
}

typedef vector<ll> vec;
typedef vector<vec> mat;

mat mul(mat &A, mat &B) {
    mat C(A.size(), vec((int)B[0].size()));
    for(int i=0; i<A.size(); ++i){
        for(int k=0; k<B.size(); ++k){
            for(int j=0; j<B[0].size(); ++j){
                C[i][j] = (C[i][j] + A[i][k] * B[k][j] %MOD) % MOD;
            }
        }
    }
    return C;
}
mat matPow(mat A, ll n) {
    mat B(A.size(), vec((int)A.size()));
 
    for(int i=0; i<A.size(); ++i){
        B[i][i] = 1;
    }
 
    while(n > 0) {
        if(n & 1) B = mul(B, A);
        A = mul(A, A);
        n >>= 1;
    }
    return B;
}

string ar[12] = {"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"};
int main() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(15);

    int t; cin >> t;
    map<string, int> mp;
    // C, C#, D, D#, E, F, F#, G, G#, A, A#, B -> C... 

    for(int i=0; i<12; i++){
        mp[ar[i]] = i;
    }
    while(t--){
        int n, m; cin >> n >> m;
        vector<string> T(n+1), S(m+1);
        for(int i=1; i<=n; i++) cin >> T[i];
        for(int i=1; i<=m; i++) cin >> S[i];

        //Sは踏むべき音, Tは今いるposの音
        bool ok = false;
        //一番最後に踏む段(n)
        int pos = n;
        
        bool check1 = true;
        for(int i=m; i>=1; i--){
            if(mp[S[i]] == mp[T[pos]]){
                pos--;
            }else if(mp[S[i]] == (mp[T[pos]]+1)%12){
                //半音高い場合 -> 2段上に
                if(pos-2>=0){
                    pos = pos-2;

                }else{
                    check1 = false;
                }
            }else if(mp[S[i]] == (mp[T[pos]]-1 + 12) % 12){
                //半音低い場合 -> 1段下に
                if(pos+1<=n){
                    pos = pos + 1;

                }else{
                    check1 = false;
                }
            }else{
                check1 = false;
            }
        }
        if(check1 && pos == 0){
            ok = true;
        }

        bool check2 = true;
        pos = n-1;
        for(int i=m; i>=1; i--){
            if(mp[S[i]] == mp[T[pos]]){
                pos--;
            }else if(mp[S[i]] == (mp[T[pos]]+1)%12){
                //半音高い場合 -> 2段上に
                if(pos-2>=0){
                    pos = pos-2;

                }else{
                    check2 = false;
                }
            }else if(mp[S[i]] == (mp[T[pos]]-1 + 12) % 12){
                //半音低い場合 -> 1段下に
                if(pos+1<=n){
                    pos = pos + 1;

                }else{
                    check2 = false;
                }
            }else{
                check2 = false;
            }
        }
        if(pos == 0 && check2){
            ok = true;
        }

        if(ok){
            cout << "Yes" << endl;
        }else{
            cout << "No" << endl;
        }
    }
    return 0;
}