#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline int read(T& a) {
  a = 0;
  char c = getchar(), f = 1;
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    if (c == -1) return -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9')
    a = (a << 1) + (a << 3) + (c ^ 48), c = getchar();
  a *= f;
  return 1;
}
template <typename T, typename... Args>
inline int read(T& x, Args&... args) {
  return read(x) + read(args...);
}
template <typename T>
inline int write(T x) {
  if (x < 0) return putchar('-') & write(-x);
  if (x / 10) return write(x / 10) & putchar(x % 10 | 48);
  return putchar(x | 48);
}
template <typename T>
inline int write(T x, char c) {
  return write(x) & putchar(c);
}
const char atom[105][3] = {
    "",   "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"};
int n, m;
int a[21], b[21];
inline int getid(const char* s) {
  for (int i = 1; i <= 100; i++)
    if (strcmp(atom[i], s) == 0) return i;
  return -1;
}
inline int sum(int num) {
  int sum = 0;
  for (int i = 1; i <= n; i++, num >>= 1) sum += (num & 1) * a[i];
  return sum;
}
bool vis[21][1 << 19];
vector<pair<int, int> > v;
inline void dfs(int sit, int s, int k) {
  if (s == b[k]) {
    if (k == m) {
      puts("YES");
      for (int i = 0; i < v.size(); i++) {
        if (i && v[i].second == v[i - 1].second) putchar('+');
        printf("%s", atom[v[i].first]);
        if (i == v.size() - 1 || v[i].second != v[i + 1].second)
          printf("->%s\n", atom[b[v[i].second]]);
      }
      exit(0);
    }
    dfs(sit, 0, k + 1);
  }
  if (s > b[k]) return;
  if (vis[k][sit]) return;
  for (int i = 1; i <= n; i++) {
    if (sit & (1 << (i - 1))) continue;
    v.push_back(make_pair(a[i], k));
    dfs(sit | (1 << (i - 1)), s + a[i], k);
    v.pop_back();
  }
  vis[k][sit] = 1;
}
signed main() {
  read(n, m);
  for (int i = 1; i <= n; i++) {
    char s[3];
    scanf("%s", s);
    a[i] = getid(s);
  }
  for (int i = 1; i <= m; i++) {
    char s[3];
    scanf("%s", s);
    b[i] = getid(s);
  }
  dfs(0, 0, 1);
  puts("NO");
}
