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 PYTHON):

Solution:
FAST_IO = 1
if FAST_IO:
    import io, sys, atexit
    rr = iter(sys.stdin.read().splitlines()).next
    sys.stdout = _OUTPUT_BUFFER = io.BytesIO()
    @atexit.register
    def write():
        sys.__stdout__.write(_OUTPUT_BUFFER.getvalue())
else:
    rr = raw_input
rri = lambda: int(rr())
rrm = lambda: map(int, rr().split())

####
from collections import Counter

def solve3(N, A, B, C, SA):
    return solve(N, A, B, C, SA, True)
    S = A+B+C
    # max(A, B, C) > 2
    # min(A, B, C) = 0
    std = sorted([A, B, C])
    if std[1] == 0:  # 0, 0, >2
        return solve(N, A, B, C, SA, True)
    # 0, >0, >2
    
def solve2(N, A, B, C, SA):
    def canonical(a, b, c):
        return a, b, c

    if A > 2 or B > 2 or C > 2:
        return solve3(N, A, B, C, SA)
    seen = [None] * (N+1)
    seen[0] = {canonical(A, B, C)}
    for i, x in enumerate(SA, 1):
        seen[i] = set()
        for a, b, c in seen[i-1]:
            if x == 0:  # BC
                na = a; nb = b + 1; nc = c - 1
                if na >= 0 and nb >= 0 and nc >= 0:
                    seen[i].add(canonical(na, nb, nc))
                na = a; nb = b - 1; nc = c + 1
                if na >= 0 and nb >= 0 and nc >= 0:
                    seen[i].add(canonical(na, nb, nc))
            if x == 1:  # AC
                na = a + 1; nb = b; nc = c - 1
                if na >= 0 and nb >= 0 and nc >= 0:
                    seen[i].add(canonical(na, nb, nc))
                na = a - 1; nb = b; nc = c + 1
                if na >= 0 and nb >= 0 and nc >= 0:
                    seen[i].add(canonical(na, nb, nc))
            if x == 2:  # AB
                na = a + 1; nb = b - 1; nc = c
                if na >= 0 and nb >= 0 and nc >= 0:
                    seen[i].add(canonical(na, nb, nc))
                na = a - 1; nb = b + 1; nc = c
                if na >= 0 and nb >= 0 and nc >= 0:
                    seen[i].add(canonical(na, nb, nc))
        if not seen[i]: return
    ans = []
    a,b,c = seen[-1].pop()
    for i in xrange(N-1, -1, -1):
        x = SA[i]
        if x == 0:  # BC
            na = a; nb = b + 1; nc = c - 1
            nei = canonical(na, nb, nc)
            if nei in seen[i]:
                ans.append('C')
                a,b,c = nei
                continue
            na = a; nb = b - 1; nc = c + 1
            nei = canonical(na, nb, nc)
            if nei in seen[i]:
                ans.append('B')
                a,b,c = nei
                continue
            return
        if x == 1:  # AC
            na = a + 1; nb = b; nc = c - 1
            nei = canonical(na, nb, nc)
            if nei in seen[i]:
                ans.append('C')
                a,b,c = nei
                continue
            na = a - 1; nb = b; nc = c + 1
            nei = canonical(na, nb, nc)
            if nei in seen[i]:
                ans.append('A')
                a,b,c = nei
                continue
            return
        if x == 2:  # AB
            na = a + 1; nb = b - 1; nc = c
            nei = canonical(na, nb, nc)
            if nei in seen[i]:
                ans.append('B')
                a,b,c = nei
                continue
            na = a - 1; nb = b + 1; nc = c
            nei = canonical(na, nb, nc)
            if nei in seen[i]:
                ans.append('A')
                a,b,c = nei
                continue
            return 
    return ans[::-1]
    
def solve(N, A, B, C, SA, flag=False):
    if flag is False and min(A, B, C) == 0:
        return solve2(N, A, B, C, SA)
    ans = []
    for x in SA:
        if x == 0:  # BC
            if B >= C:
                B -= 1
                C += 1
                ans.append('C')
            else:
                B += 1
                C -= 1
                ans.append('B')
        elif x == 1: #AC
            if A >= C:
                A -= 1
                C += 1
                ans.append('C')
            else:
                A += 1
                C -= 1
                ans.append('A')
        else:  # AB
            if A >= B:
                A -= 1
                B += 1
                ans.append('B')
            else:
                A += 1
                B -= 1
                ans.append('A')
        if A<0 or B<0 or C<0: return
    return ans
    
N, A, B, C = rrm()
SA = []
for _ in xrange(N):
    s = rr()
    if s == 'AB':
        SA.append(2)
    elif s == 'BC':
        SA.append(0)
    else:
        SA.append(1)
ans = solve(N, A, B, C, SA)
if ans:
    print "Yes"
    for x in ans: print x
else:
    print "No"