#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>

using namespace __gnu_pbds;
using namespace std;

typedef unsigned long long int ull;
typedef long double ldb;
typedef long long int ll;

#define for01(k,n)  for (ll i=k; i<n; i++)
#define for02(k,n)  for (ll j=k; j<n; j++)
#define for03(k,n)  for (ll k=k; k<n; k++)
#define for11(k,n)  for (ll i=k; i<=n; i++)
#define for12(k,n)  for (ll j=k; j<=n; j++)
#define for13(k,n)  for (ll k=k; k<=n; k++)

#define pb push_back
#define mp make_pair
#define pf push_front
#define popf pop_front
#define popb pop_back
#define vll vector<ll>
#define f first
#define s second
#define pp pair <ll, ll>
#define lb lower_bound
#define ub upper_bound
#define emp empty()
#define beg begin()
#define en end()
#define si size()
#define bk back()
#define deci(n)  fixed<<setprecision(n)
#define mll map<ll,ll>
#define mint map<int,int>
#define mll_it map<ll,ll>::iterator
#define mint_it map<int,int>::iterator

#define p0(a) cout << a << " "
#define p1(a) cout << a << "\n"

#define mem(a,n) memset(a, n, sizeof(a)); // n = 0 OR -1 only

#define MAX LLONG_MAX
#define MIN LLONG_MIN
#define MOD 1000000007
#define MOD2 998244353

#define BOOST ios_base::sync_with_stdio(false); cin.tie(NULL)



// CUSTOM HASH FUNCTION - O(1)
struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};


//gp_hash_table - Open Address Hash Table

//gp_hash_table<int, int> table;

const int RANDOM = chrono::high_resolution_clock::now().time_since_epoch().count();
struct chash {
    int operator()(int x) const { return x ^ RANDOM; }
};
//gp_hash_table<key, int, chash> table;


// Indexed Set
typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> indSet;

/* FUNCTIONS:
1. The function "find_by_order" returns an iterator to the element at a given position:
2. The function "order_of_key" returns the position of a given element
	-> If the element does not appear in the set, we get the position that the element
	   would have in the set
	-> O(log n)*/

void swap(multimap<char, int>& mp1, multimap<char, int>&mp2, char c1, char c2)
{
    auto it1 = mp1.find(c1);
    auto it2 = mp2.find(c2);

    //p1(it1->s << " " << it2->s);
    mp1.erase(it1);
    mp2.erase(it2);

    mp1.insert(mp(c2, it2->s));
    mp2.insert(mp(c1, it1->s));
}


int main()
{
  BOOST;
  ll n,m;
  cin >> n >> m;
  
  char a[n][n];
  char b[m][m];
  
  for01(0, n)
  {
    for02(0, n)
      cin >> a[i][j];
  }
  for01(0, m)
  {
    for02(0, m)
      cin >> b[i][j];
  }
  
 /* for01(0, n)
  {
    for02(0, n)
      p0(a[i][j]);
    p1("");
  }
  
  for01(0, m)
  {
   for02(0, m)
     p0(a[i][j]);
    p1("");
  }*/
  ll f = 0;
 
    for(int j = 0; j < n; j++)
    {
      for(int k = 0; k < n; k++)
      {
        if(k + m - 1 >= n || j + m - 1 >=n)
          continue;
          ll ans = 0;
        for(int p = 0; p < m;p++)
        {
          for(int q = 0; q < m; q++)
          {
            if(b[p][q] != a[p+j][k+q])
              ans = 1;
          }
        }
        if(ans == 0)
          f = 1;
      }
    }
     
  if(f == 1)
    p1("Yes");
  else
  	p1("No");
         
  

  return 0;
}

Measured memory_bytes: 256