Problem: There is the following puzzle popular among nuclear physicists.

A reactor contains a set of n atoms of some chemical elements. We shall understand the phrase "atomic number" as the number of this atom's element in the periodic table of the chemical elements.

You are allowed to take any two different atoms and fuse a new one from them. That results in a new atom, whose number is equal to the sum of the numbers of original atoms. The fusion operation can be performed several times.

The aim is getting a new pregiven set of k atoms.

The puzzle's difficulty is that it is only allowed to fuse two atoms into one, it is not allowed to split an atom into several atoms. You are suggested to try to solve the puzzle.

Input

The first line contains two integers n and k (1 ≤ k ≤ n ≤ 17). The second line contains space-separated symbols of elements of n atoms, which are available from the start. The third line contains space-separated symbols of elements of k atoms which need to be the result of the fusion. The symbols of the elements coincide with the symbols from the periodic table of the chemical elements. The atomic numbers do not exceed 100 (elements possessing larger numbers are highly unstable). Some atoms can have identical numbers (that is, there can be several atoms of the same element). The sum of numbers of initial atoms is equal to the sum of numbers of the atoms that need to be synthesized.

Output

If it is impossible to synthesize the required atoms, print "NO" without the quotes. Otherwise, print on the first line «YES», and on the next k lines print the way of synthesizing each of k atoms as equations. Each equation has the following form: "x1+x2+...+xt->yi", where xj is the symbol of the element of some atom from the original set, and yi is the symbol of the element of some atom from the resulting set. Each atom from the input data should occur in the output data exactly one time. The order of summands in the equations, as well as the output order does not matter. If there are several solutions, print any of them. For a better understanding of the output format, see the samples.

Examples

Input

10 3
Mn Co Li Mg C P F Zn Sc K
Sn Pt Y


Output

YES
Mn+C+K-&gt;Sn
Co+Zn+Sc-&gt;Pt
Li+Mg+P+F-&gt;Y


Input

2 1
H H
He


Output

YES
H+H-&gt;He


Input

2 2
Bk Fm
Cf Es


Output

NO

Note

The reactions from the first example possess the following form (the atomic number is written below and to the left of the element):

<image>

<image>

<image>

To find a periodic table of the chemical elements, you may use your favorite search engine.

The pretest set contains each of the first 100 elements of the periodic table at least once. You can use that information to check for misprints.

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:264777216")
const char *st =
    "2 H\n3 He\n4 Li\n5 Be\n6 B\n7 C\n8 N\n9 O\n10 F\n11 Ne\n12 Na\n13 Mg\n14 "
    "Al\n15 Si\n16 P\n17 S\n18 Cl\n19 Ar\n20 K\n21 Ca\n22 Sc\n23 Ti\n24 V\n25 "
    "Cr\n26 Mn\n27 Fe\n28 Co\n29 Ni\n30 Cu\n31 Zn\n32 Ga\n33 Ge\n34 As\n35 "
    "Se\n36 Br\n37 Kr\n38 Rb\n39 Sr\n40 Y\n41 Zr\n42 Nb\n43 Mo\n44 Tc\n45 "
    "Ru\n46 Rh\n47 Pd\n48 Ag\n49 Cd\n50 In\n51 Sn\n52 Sb\n53 Te\n54 I\n55 "
    "Xe\n56 Cs\n72 Ba\n73 Hf\n74 Ta\n75 W\n76 Re\n77 Os\n78 Ir\n79 Pt\n80 "
    "Au\n81 Hg\n82 Tl\n83 Pb\n84 Bi\n85 Po\n86 At\n87 Rn\n88 Fr\n104 Ra\n105 "
    "Rf\n106 Db\n107 Sg\n108 Bh\n109 Hs\n110 Mt\n111 Ds\n112 Rg\n113 Cn\n114 "
    "Uut\n115 Uuq\n116 Uup\n117 Uuh\n118 Uus\n57 Uuo\n58 La\n59 Ce\n60 Pr\n61 "
    "Nd\n62 Pm\n63 Sm\n64 Eu\n65 Gd\n66 Tb\n67 Dy\n68 Ho\n69 Er\n70 Tm\n71 "
    "Yb\n89 Lu\n90 Ac\n91 Th\n92 Pa\n93 U\n94 Np\n95 Pu\n96 Am\n97 Cm\n98 "
    "Bk\n99 Cf\n100 Es\n101 Fm\n102 Md\n103 No\n";
int n, k;
vector<string> from;
vector<string> to;
map<string, int> key;
int VFrom[100];
int VTo[100];
vector<int> gr[100];
set<pair<int, int> > dp;
bool rec(int i, int mask) {
  if (i >= k && mask == (1 << n) - 1) {
    cout << "YES" << endl;
    return true;
  }
  if (dp.find(pair<int, int>(i, mask)) != dp.end()) return false;
  dp.insert(pair<int, int>(i, mask));
  for (int j = 0; j < gr[i].size(); ++j) {
    if ((mask & gr[i][j]) == 0) {
      if (rec(i + 1, mask + gr[i][j])) {
        int is = true;
        for (int f = 0, b = gr[i][j]; b > 0; ++f, b /= 2) {
          if (b % 2 == 1) {
            if (is == false) cout << "+";
            cout << from[f];
            is = false;
          }
        }
        cout << "->";
        cout << to[i] << endl;
        return true;
      }
    }
  }
  return false;
}
void Solve() {
  cin >> n >> k;
  for (int i = 0; i < n; ++i) {
    string st;
    cin >> st;
    from.push_back(st);
  }
  for (int i = 0; i < k; ++i) {
    string st;
    cin >> st;
    to.push_back(st);
  }
  istringstream in(st);
  int val = 1;
  string str;
  int old = val;
  for (; in >> val >> str;) {
    key[str] = old;
    old = val;
  }
  for (int i = 0; i < n; ++i) {
    VFrom[i] = key[from[i]];
  }
  for (int i = 0; i < k; ++i) {
    VTo[i] = key[to[i]];
  }
  for (int i = 0; i < (1 << n); ++i) {
    int b = i;
    int suma = 0;
    for (int j = 0; b > 0; b /= 2, ++j) {
      if (b % 2 == 1) {
        suma += VFrom[j];
      }
    }
    for (int j = 0; j < k; ++j) {
      if (suma == VTo[j]) {
        gr[j].push_back(i);
      }
    }
  }
  if (rec(0, 0) == false) {
    cout << "NO";
  }
}
int main() {
  Solve();
  return 0;
}