#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void read(T& x) {
  char c;
  bool f = 0;
  while ((c = getchar()) < '0' || '9' < c) f |= (c == '-');
  for (x = (c ^ 48); '0' <= (c = getchar()) && c <= '9';
       x = (x << 1) + (x << 3) + (c ^ 48))
    ;
  if (f) x = -x;
}
template <class T>
inline T read(const T sample) {
  T x = 0;
  char c;
  bool f = 0;
  while ((c = getchar()) < '0' || '9' < c) f |= (c == '-');
  for (x = (c ^ 48); '0' <= (c = getchar()) && c <= '9';
       x = (x << 1) + (x << 3) + (c ^ 48))
    ;
  return f ? -x : x;
}
template <class T>
void fwrit(const T x) {
  if (x < 0) return (void)(putchar('-'), fwrit(-x));
  if (x > 9) fwrit(x / 10);
  putchar(x % 10 ^ 48);
}
template <class T>
inline T Max(const T x, const T y) {
  return x > y ? x : y;
}
template <class T>
inline T Min(const T x, const T y) {
  return x < y ? x : y;
}
template <class T>
inline T fab(const T x) {
  return x > 0 ? x : -x;
}
inline int gcd(const int a, const int b) { return b ? gcd(b, a % b) : a; }
inline void getInv(int inv[], const int lim, const int MOD) {
  inv[0] = inv[1] = 1;
  for (int i = 2; i <= lim; ++i)
    inv[i] = 1ll * inv[MOD % i] * (MOD - MOD / i) % MOD;
}
inline long long mulMod(const long long a, const long long b,
                        const long long mod) {
  return ((a * b - (long long)((long double)a / mod * b + 1e-8) * mod) % mod +
          mod) %
         mod;
}
const int MAXN = 17;
const int MAXSIZE = (1 << MAXN) - 1;
const string atom[] = {
    "",   "H",  "He", "Li", "Be", "B",  "C",  "N",  "O",  "F",  "Ne", "Na",
    "Mg", "Al", "Si", "P",  "S",  "Cl", "Ar", "K",  "Ca", "Sc", "Ti", "V",
    "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", "As", "Se", "Br",
    "Kr", "Rb", "Sr", "Y",  "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag",
    "Cd", "In", "Sn", "Sb", "Te", "I",  "Xe", "Cs", "Ba", "La", "Ce", "Pr",
    "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu",
    "Hf", "Ta", "W",  "Re", "Os", "Ir", "Pt", "Au", "Hg", "Tl", "Pb", "Bi",
    "Po", "At", "Rn", "Fr", "Ra", "Ac", "Th", "Pa", "U",  "Np", "Pu", "Am",
    "Cm", "Bk", "Cf", "Es", "Fm"};
map<string, int> val;
string ori[MAXN + 5], goal[MAXN + 5];
int a[MAXN + 5], b[MAXN + 5], n, k, all;
int sum[MAXSIZE + 5];
inline void Init() {
  for (signed i = (1), i_end_ = (100); i <= i_end_; ++i) val[atom[i]] = i;
  cin >> n >> k;
  for (signed i = (0), i_end_ = (n - 1); i <= i_end_; ++i) {
    cin >> ori[i];
    a[i] = val[ori[i]];
  }
  for (signed i = (0), i_end_ = (k - 1); i <= i_end_; ++i) {
    cin >> goal[i];
    b[i] = val[goal[i]];
  }
}
inline void Make_sum() {
  all = (1 << n) - 1;
  for (signed t = (0), t_end_ = (all); t <= t_end_; ++t)
    for (signed i = (0), i_end_ = (n - 1); i <= i_end_; ++i)
      if ((t >> i) & 1) sum[t] += a[i];
}
int situ[MAXN + 5];
bool failed[MAXN + 5][MAXSIZE + 5];
bool Dfs(const int now, const int s) {
  if (now == k) {
    if (s == 0) return true;
    return false;
  }
  if (sum[s] < b[now]) return false;
  if (failed[now][s]) return false;
  for (int t = s; t; t = s & (t - 1))
    if (sum[t] == b[now]) {
      situ[now] = t;
      if (Dfs(now + 1, s ^ t)) return true;
    }
  failed[now][s] = true;
  return false;
}
inline void WritAns(const bool exist) {
  if (!exist) return void(cout << "NO" << endl);
  cout << "YES" << endl;
  for (signed t = (0), t_end_ = (k - 1); t <= t_end_; ++t) {
    for (signed i = (0), i_end_ = (n - 1); i <= i_end_; ++i)
      if ((situ[t] >> i) & 1) {
        cout << ori[i];
        situ[t] ^= (1 << i);
        if (situ[t])
          cout << "+";
        else {
          cout << "->";
          break;
        }
      }
    cout << goal[t] << endl;
  }
}
signed main() {
  Init();
  Make_sum();
  if (Dfs(0, all))
    WritAns(true);
  else
    WritAns(false);
  return 0;
}
