#include <bits/stdc++.h>
using namespace std;
const int PN = 100;
const int MAX_N = 17;
const int NBITS = 1 << MAX_N;
const int MAX_K = 17;
const string pts[] = {
    "",   "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> ptmap;
char s[16];
int as[MAX_N], bs[MAX_K], asums[NBITS], ans[MAX_K];
bool dp[MAX_K + 1][NBITS];
int prvs[MAX_K + 1][NBITS];
vector<int> cbits[MAX_K];
bool check(int u, int k, int bits) {
  if (u >= k) return true;
  vector<int> &cbu = cbits[u];
  for (vector<int>::iterator vit = cbu.begin(); vit != cbu.end(); vit++) {
    int &cb = *vit;
    if (!(bits & cb)) {
      ans[u] = cb;
      if (check(u + 1, k, bits | cb)) return true;
    }
  }
  return false;
}
int main() {
  for (int i = 1; i <= PN; i++) ptmap[pts[i]] = i;
  int n, k;
  scanf("%d%d", &n, &k);
  for (int i = 0; i < n; i++) {
    scanf("%s", s);
    as[i] = ptmap[string(s)];
  }
  for (int i = 0; i < k; i++) {
    scanf("%s", s);
    bs[i] = ptmap[string(s)];
  }
  int nbits = 1 << n;
  asums[0] = 0;
  for (int bits = 1, bi = 0, msb = 1; bits < nbits; bits++) {
    if ((msb << 1) <= bits) msb <<= 1, bi++;
    asums[bits] = asums[bits ^ msb] + as[bi];
    for (int i = 0; i < k; i++)
      if (bs[i] == asums[bits]) cbits[i].push_back(bits);
  }
  dp[0][0] = true;
  prvs[0][0] = -1;
  for (int i = 0; i < k; i++) {
    vector<int> &cbi = cbits[i];
    for (int bits = 0; bits < nbits; bits++)
      if (dp[i][bits]) {
        for (vector<int>::iterator vit = cbi.begin(); vit != cbi.end(); vit++) {
          int &cb = *vit;
          if (!(bits & cb)) {
            dp[i + 1][bits | cb] = true;
            prvs[i + 1][bits | cb] = bits;
          }
        }
      }
  }
  if (dp[k][nbits - 1]) {
    puts("YES");
    for (int i = k, bits = nbits - 1; i > 0; i--) {
      int &pb = prvs[i][bits];
      ans[i - 1] = bits ^ pb;
      bits = pb;
    }
    for (int i = 0; i < k; i++) {
      for (int j = 0, bj = 1, cont = 0; j < n; j++, bj <<= 1)
        if (ans[i] & bj) {
          if (cont) putchar('+');
          printf("%s", pts[as[j]].c_str());
          cont = 1;
        }
      printf("->%s\n", pts[bs[i]].c_str());
    }
  } else
    puts("NO");
  return 0;
}
