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 Python (3.8.2) (judge verdict: Accepted)

import bisect
import os

import sys

if os.getenv("LOCAL"):
    sys.stdin = open("_in.txt", "r")

sys.setrecursionlimit(10 ** 9)
INF = float("inf")
IINF = 10 ** 18
MOD = 10 ** 9 + 7
# MOD = 998244353


N, A, B, C = list(map(int, sys.stdin.buffer.readline().split()))
S = [sys.stdin.buffer.readline().decode().rstrip() for _ in range(N)]


def get_idx(c):
    ret = []
    for i, s in enumerate(S):
        if c == s:
            ret.append(i)
    ret.append(N)
    return ret


ab_idx = get_idx('AB')
ac_idx = get_idx('AC')
bc_idx = get_idx('BC')

# 0,0 にしなければいい
a, b, c = A, B, C
ans = []
ok = True
for i, s in enumerate(S):
    pa, pb, pc = a, b, c
    if s == 'AB':
        if a == b == 0:
            ok = False
            break
        elif a > b:
            a -= 1
            b += 1
        elif a < b:
            a += 1
            b -= 1
        elif a == b == 1:
            ai = ac_idx[bisect.bisect_left(ac_idx, i)]
            bi = bc_idx[bisect.bisect_left(bc_idx, i)]
            if ai < bi:
                a += 1
                b -= 1
            else:
                a -= 1
                b += 1
        else:
            a -= 1
            b += 1
    if s == 'AC':
        if a == c == 0:
            ok = False
            break
        elif a > c:
            a -= 1
            c += 1
        elif a < c:
            a += 1
            c -= 1
        elif a == c == 1:
            ai = ab_idx[bisect.bisect_left(ab_idx, i)]
            ci = bc_idx[bisect.bisect_left(bc_idx, i)]
            if ai < ci:
                a += 1
                c -= 1
            else:
                a -= 1
                c += 1
        else:
            a -= 1
            c += 1
    if s == 'BC':
        if c == b == 0:
            ok = False
            break
        elif c > b:
            c -= 1
            b += 1
        elif c < b:
            c += 1
            b -= 1
        elif c == b == 1:
            ci = ac_idx[bisect.bisect_left(ac_idx, i)]
            bi = ab_idx[bisect.bisect_left(ab_idx, i)]
            if ci < bi:
                c += 1
                b -= 1
            else:
                c -= 1
                b += 1
        else:
            c -= 1
            b += 1

    if pa < a:
        ans.append('A')
    elif pb < b:
        ans.append('B')
    elif pc < c:
        ans.append('C')
    else:
        assert False
if ok:
    print('Yes')
else:
    print('No')
    exit()
print(*ans, sep='\n')