Problem:
Score : 600 points

Problem Statement

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.

Sample Input 1

2 1 3 0
AB
AC

Sample Output 1

Yes
A
C

You can successfully make two choices, as follows:

In the first choice, add 1 to A and subtract 1 from B. A becomes 2, and B becomes 2.

In the second choice, add 1 to C and subtract 1 from A. C becomes 1, and A becomes 1.

Sample Input 2

3 1 0 0
AB
BC
AB

Sample Output 2

No

Sample Input 3

1 0 9 0
AC

Sample Output 3

No

Sample Input 4

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

Sample Output 4

Yes
C
B
B
C
C
B
A
A

Solution in Java (OpenJDK 11.0.6) (judge verdict: Wrong Answer)

import java.util.*;
public class Main {

	public static void main(String[] args) {
		Scanner a = new Scanner(System.in);
		
		String b = a.nextLine();
		String[] l = b.split(" ");
		int[] list = new int[4];
		
		
		for (int i=0;i<l.length;i++) {
			list[i]=Integer.parseInt(l[i]);
		}
		int[] vals = {list[1],list[2],list[3]};
		String[] choices = new String[list[0]];
		
		boolean check=true;
		for (int j=0;j<choices.length;j++) {
			String pair = a.nextLine();
			if (pair.equals("AB")) {
				if (vals[0]>vals[1]) {
					choices[j]="B";
					vals[0]--;
					vals[1]++;
				}
				else {
					choices[j]="A";
					vals[1]--;
					vals[0]++;
				}
			}
			else if (pair.equals("BC")) {
				if (vals[1]>vals[2]) {
					choices[j]="C";
					vals[1]--;
					vals[2]++;
				}
				else {
					choices[j]="B";
					vals[2]--;
					vals[1]++;
				}
			}
			else if (pair.equals("AC")) {
				if (vals[0]>vals[2]) {
					choices[j]="C";
					vals[0]--;
					vals[2]++;
				}
				else {
					choices[j]="A";
					vals[2]--;
					vals[0]++;
				}
			}
			if (vals[0]<0 || vals[1]<0 || vals[2]<0) {
				System.out.println("No");
				check=false;
			}
		}
		if (check) {
			System.out.println("Yes");
			for (int m =0;m<choices.length;m++) {
				System.out.println(choices[m]);
			}
		}
		a.close();
	}
}