#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-9;
const int BUFFER_SIZE = 1 << 15;
const int MOD = 1000 * 1000 * 1000 + 7;
const int INF = 1 << 30;
const long long LINF = 1ll << 60;
char BUFFER[BUFFER_SIZE];
int gi() {
  int x;
  scanf("%d", &x);
  return x;
}
double gd() {
  double x;
  scanf("%lf", &x);
  return x;
}
long long gll() {
  long long x;
  cin >> x;
  return x;
}
vector<int> gvi(int n) {
  vector<int> a;
  while (n--) a.push_back(gi());
  return a;
}
string gs() {
  scanf("%s", BUFFER);
  return string(BUFFER);
}
template <class T>
struct forArray {
  T *a;
  int n;
  forArray(T *a, int n) : a(a), n(n) {}
};
template <class A, class B>
ostream &operator<<(ostream &os, const pair<A, B> &d);
template <class T>
ostream &operator<<(ostream &os, const vector<T> &d);
template <class T>
ostream &operator<<(ostream &os, const queue<T> &d);
template <class T>
ostream &operator<<(ostream &os, const stack<T> &d);
template <class T>
ostream &operator<<(ostream &os, const set<T> &d);
template <class T>
ostream &operator<<(ostream &os, const multiset<T> &d);
template <class T>
ostream &operator<<(ostream &os, const unordered_set<T> &d);
template <class A, class B>
ostream &operator<<(ostream &os, const map<A, B> &d);
template <class A, class B>
ostream &operator<<(ostream &os, const multimap<A, B> &d);
template <class A, class B>
ostream &operator<<(ostream &os, const unordered_map<A, B> &d);
template <class T>
ostream &operator<<(ostream &os, const vector<T> &d) {
  os << "[";
  int f = 0;
  for (auto x : d) {
    if (f) os << ",";
    f = 1;
    os << x;
  }
  return os << "]";
};
template <class T>
ostream &operator<<(ostream &os, const queue<T> &d) {
  os << "[";
  int f = 0;
  for (auto x : d) {
    if (f) os << ",";
    f = 1;
    os << x;
  }
  return os << "]";
};
template <class T>
ostream &operator<<(ostream &os, const stack<T> &d) {
  os << "[";
  int f = 0;
  for (auto x : d) {
    if (f) os << ",";
    f = 1;
    os << x;
  }
  return os << "]";
};
template <class T>
ostream &operator<<(ostream &os, const set<T> &d) {
  os << "[";
  int f = 0;
  for (auto x : d) {
    if (f) os << ",";
    f = 1;
    os << x;
  }
  return os << "]";
};
template <class T>
ostream &operator<<(ostream &os, const multiset<T> &d) {
  os << "[";
  int f = 0;
  for (auto x : d) {
    if (f) os << ",";
    f = 1;
    os << x;
  }
  return os << "]";
};
template <class T>
ostream &operator<<(ostream &os, const unordered_set<T> &d) {
  os << "[";
  int f = 0;
  for (auto x : d) {
    if (f) os << ",";
    f = 1;
    os << x;
  }
  return os << "]";
};
template <class A, class B>
ostream &operator<<(ostream &os, const map<A, B> &d) {
  os << "[";
  int f = 0;
  for (auto x : d) {
    if (f) os << ",";
    f = 1;
    os << x;
  }
  return os << "]";
};
template <class A, class B>
ostream &operator<<(ostream &os, const multimap<A, B> &d) {
  os << "[";
  int f = 0;
  for (auto x : d) {
    if (f) os << ",";
    f = 1;
    os << x;
  }
  return os << "]";
};
template <class A, class B>
ostream &operator<<(ostream &os, const unordered_map<A, B> &d) {
  os << "[";
  int f = 0;
  for (auto x : d) {
    if (f) os << ",";
    f = 1;
    os << x;
  }
  return os << "]";
};
template <class T>
ostream &operator<<(ostream &os, const forArray<T> &d) {
  os << "[";
  for (int i = 0; i < d.n; ++i) {
    if (i) os << ",";
    os << d.a[i];
  }
  return os << "]";
}
template <class A, class B>
ostream &operator<<(ostream &os, const pair<A, B> &d) {
  return os << "[" << d.first << ", " << d.second << "]";
}
vector<string> E = {
    "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", "Md", "No", "Lr", "Rf", "Db", "Sg", "Bh", "Hs",
    "Mt", "Ds", "Rg", "Cn", "Nh", "Fl", "Mc", "Lv", "Ts", "Og"};
int idx(string s) {
  for (int i = 0; i < E.size(); ++i)
    if (E[i] == s) return i + 1;
}
vector<int> A;
vector<int> B;
vector<string> As, Bs;
int S[1 << 17];
int dp[17][1 << 17];
int P[17][1 << 17];
int go(int m, int p) {
  if (p == B.size()) return 1;
  int &r = dp[p][m];
  if (r == -1) {
    r = 0;
    for (int x = m; x; x = (x - 1) & m) {
      if (S[x] == B[p] && go(m ^ x, p + 1)) {
        P[p][m] = x;
        r = 1;
      }
    }
  }
  return r;
}
int main() {
  int n = gi();
  int m = gi();
  for (int i = 0; i < n; ++i) {
    As.push_back(gs());
    A.push_back(idx(As.back()));
  }
  for (int i = 0; i < m; ++i) {
    Bs.push_back(gs());
    B.push_back(idx(Bs.back()));
  }
  for (int i = 0; i < 1 << n; ++i) {
    for (int j = 0; j < n; ++j)
      if (i >> j & 1) S[i] += A[j];
  }
  memset((dp), (-1), sizeof(dp));
  if (go((1 << n) - 1, 0)) {
    printf("YES\n");
    int m = (1 << n) - 1;
    int p = 0;
    while (p < B.size()) {
      int x = P[p][m];
      vector<string> res;
      for (int i = 0; i < n; ++i)
        if (x >> i & 1) res.push_back(As[i]);
      for (int i = 0; i < res.size(); ++i)
        printf("%s%c", res[i].c_str(), i + 1 == res.size() ? '-' : '+');
      printf(">%s\n", Bs[p].c_str());
      m ^= x;
      ++p;
    }
  } else {
    printf("NO\n");
  }
  return 0;
}
