Problem: There is a game that involves three variables, denoted A, B, and C.

As the game progresses, there will be N events where you are asked to make a choice. Each of these choices is represented by a string s_i. If s_i is `AB`, you must add 1 to A or B then subtract 1 from the other; if s_i is `AC`, you must add 1 to A or C then subtract 1 from the other; if s_i is `BC`, you must add 1 to B or C then subtract 1 from the other.

After each choice, none of A, B, and C should be negative.

Determine whether it is possible to make N choices under this condition. If it is possible, also give one such way to make the choices.

Constraints

* 1 \leq N \leq 10^5
* 0 \leq A,B,C \leq 10^9
* N, A, B, C are integers.
* s_i is `AB`, `AC`, or `BC`.

Input

Input is given from Standard Input in the following format:


N A B C
s_1
s_2
:
s_N


Output

If it is possible to make N choices under the condition, print `Yes`; otherwise, print `No`.

Also, in the former case, show one such way to make the choices in the subsequent N lines. The (i+1)-th line should contain the name of the variable (`A`, `B`, or `C`) to which you add 1 in the i-th choice.

Examples

Input

2 1 3 0
AB
AC


Output

Yes
A
C


Input

3 1 0 0
AB
BC
AB


Output

No


Input

1 0 9 0
AC


Output

No


Input

8 6 9 1
AC
BC
AB
BC
AC
BC
AB
AB


Output

Yes
C
B
B
C
C
B
A
A

Solution (in JAVA):

Solution:

import java.io.BufferedReader;
import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayDeque;
import java.util.StringTokenizer;

public class Main implements Closeable {

  private InputReader in = new InputReader(System.in);
  private PrintWriter out = new PrintWriter(System.out);

  public void solve() {
    n = in.ni();
    int a = in.ni(), b = in.ni(), c = in.ni();
    x = new String[n];
    for (int i = 0; i < n; i++) {
      x[i] = in.next();
    }
    dfs(a, b, c, 0);
    if (possible) {
      out.println("Yes");
      out.print(result.toString());
    } else {
      out.println("No");
    }
  }

  private boolean possible;
  private int n;
  private String[] x;
  private ArrayDeque<Character> path = new ArrayDeque<>();
  private StringBuilder result = new StringBuilder();

  private void dfs(int a, int b, int c, int idx) {
    if (possible) return;
    if (a < 0 || b < 0 || c < 0) {
      return;
    }
    if (idx == n) {
      possible = true;
      while (path.size() > 0) {
        result.append(path.pollFirst());
        result.append("\n");
      }
      return;
    }
    String command = x[idx];
    if ("AB".equals(command)) {
      path.addLast('A');
      dfs(a + 1, b - 1, c, idx + 1);
      if (path.size() > 0) path.pollLast();

      path.addLast('B');
      dfs(a - 1, b + 1, c, idx + 1);
      if (path.size() > 0) path.pollLast();
    } else if ("BC".equals(command)) {
      path.addLast('B');
      dfs(a, b + 1, c - 1, idx + 1);
      if (path.size() > 0) path.pollLast();

      path.addLast('C');
      dfs(a, b - 1, c + 1, idx + 1);
      if (path.size() > 0) path.pollLast();
    } else if ("AC".equals(command)) {
      path.addLast('A');
      dfs(a + 1, b, c - 1, idx + 1);
      if (path.size() > 0) path.pollLast();

      path.addLast('C');
      dfs(a - 1, b, c + 1, idx + 1);
      if (path.size() > 0) path.pollLast();
    }
  }

  @Override
  public void close() throws IOException {
    in.close();
    out.close();
  }

  static class InputReader {
    public BufferedReader reader;
    public StringTokenizer tokenizer;

    public InputReader(InputStream stream) {
      reader = new BufferedReader(new InputStreamReader(stream), 32768);
      tokenizer = null;
    }

    public String next() {
      while (tokenizer == null || !tokenizer.hasMoreTokens()) {
        try {
          tokenizer = new StringTokenizer(reader.readLine());
        } catch (IOException e) {
          throw new RuntimeException(e);
        }
      }
      return tokenizer.nextToken();
    }

    public int ni() {
      return Integer.parseInt(next());
    }

    public long nl() {
      return Long.parseLong(next());
    }

    public void close() throws IOException {
      reader.close();
    }
  }

  public static void main(String[] args) throws IOException {
    try (Main instance = new Main()) {
      instance.solve();
    }
  }
}