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 C++ (GCC 9.2.1) (judge verdict: Runtime Error)

#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#include <map>
#include <algorithm>
#include <iomanip>
#include <math.h>
#include <string.h>
#include <cstdio>
#include <tuple>
using namespace std; using ll = long long; using ld = long double;  using pll = pair<ll, ll>;
using vl = vector<ll>; using vll = vector<vl>; using vpll = vector<pll>;
const ld PI = 3.1415926535897932;
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#define rep1(n) for(ll i=0;i<n;++i)
#define rep2(i,n) for(ll i=0;i<n;++i)
#define rep3(i,a,b) for(ll i=a;i<b;++i)
#define rep4(i,a,b,c) for(ll i=a;i<b;i+=c)
#define rep(...) overload4(__VA_ARGS__,rep4,rep3,rep2,rep1)(__VA_ARGS__)
#define mp make_pair
#define mt make_tuple
#define INT(...) int __VA_ARGS__;in(__VA_ARGS__)
#define LL(...) ll __VA_ARGS__;in(__VA_ARGS__)
#define ULL(...) ull __VA_ARGS__;in(__VA_ARGS__)
#define STR(...) string __VA_ARGS__;in(__VA_ARGS__)
#define CHR(...) char __VA_ARGS__;in(__VA_ARGS__)
#define DBL(...) double __VA_ARGS__;in(__VA_ARGS__)
#define LD(...) ld __VA_ARGS__;in(__VA_ARGS__)
void in() {}
void debug_out() { cerr << endl; }
template<typename Head, typename... Tail>
void debug_out(Head h, Tail... t) {
	cerr << " " << h;
	if (sizeof...(t) > 0) cerr << " :";
	debug_out(t...);
}
template <typename T>
ostream& operator<<(ostream& os, vector<T> vec) {
	for (size_t i = 0; i < vec.size(); i++)os << vec[i] << (i + 1 == vec.size() ? "" : " ");
	return os;
}
ll ctoi(char c) {
	switch (c) {
	case '0': return 0; case '1': return 1; case '2': return 2;
	case '3': return 3; case '4': return 4; case '5': return 5;
	case '6': return 6; case '7': return 7; case '8': return 8;
	case '9': return 9;  default: return 0;
	}
}
void vout(vl V) {
	for (ll i = 0; i < (ll)V.size(); i++) cout << V[i] << " ";
	cout << endl;
}
bool pairCompare(const pll firstElof, pll secondElof)
{
	return firstElof.first > secondElof.first;
}
//**Snippetリスト**//
//rep, vin, all, iteLoop//
//bitSearch, bitList, nod, gcdlcm, isPrime, primeFactorize, Npow, divisor, modinv, dfs, bfs, eratos//
//dijkstra, WarshallFloyd, BellmanFord, UnionFind, COM, digitDP ,RMQ//
ll i, j, k, l; ll N, M, K, H, W, L, X, Y, Z, R, Q;
ll MOD = 1000000007; ll INF = 1LL << 62; ll ans = 0; ll z = 0, o = 1;
vl flag, color; vll path; vl A; vl dp; vl Ans;

int main() {
	ll A, B, C;
	cin >> N >> A >> B >> C;
	vector<string> S(N);
	vector<char> Ans;
	for (i = 0; i < N; i++) cin >> S[i];
	if (A + B + C == 0) {
		cout << "No";
	}
	else {
		for (i = 0; i < N; i++) {
			if (S[i] == "AB") {
				if (A == 0 && B == 0) {
					cout << "No";
					exit(0);
				}
				else if (A == 0) {
					A++; B--;
					Ans.push_back('A');
				}
				else if (B == 0) {
					A--; B++;
					Ans.push_back('B');
				}
				else if(A==1 && B==1 && i!=N-1)
				{
					if (S[i+1] == "AC") {
						A++; B--;
						Ans.push_back('A');
					}
					else {
						A--; B++;
						Ans.push_back('B');
					}
				}
				else {
					A++; B--;
					Ans.push_back('A');
				}
			}
			if (S[i] == "AC") {
				if (A == 0 && C == 0) {
					cout << "No";
					exit(0);
				}
				else if (A == 0) {
					A++; C--;
					Ans.push_back('A');
				}
				else if (C == 0) {
					A--; C++;
					Ans.push_back('C');
				}
				else if (A == 1 && C == 1 && i != N - 1)
				{
					if (S[i+1] == "AB") {
						A++; C--;
						Ans.push_back('A');
					}
					else {
						A--; C++;
						Ans.push_back('C');
					}
				}
				else {
					A++; C--;
					Ans.push_back('A');
				}
			}
			if (S[i] == "BC") {
				if (B == 0 && C == 0) {
					cout << "No";
					exit(0);
				}
				else if (B == 0) {
					B++; C--;
					Ans.push_back('B');
				}
				else if (C == 0) {
					B--; C++;
					Ans.push_back('C');
				}
				else if (B == 1 && C == 1 && i != N - 1)
				{
					if (S[i+1] == "AB") {
						B++; C--;
						Ans.push_back('B');
					}
					else {
						B--; C++;
						Ans.push_back('C');
					}
				}
				else {
					B++; C--;
					Ans.push_back('B');
				}
			}
			//debug(A, B, C);
		}
	}
	cout << "Yes" << endl;
	for (i = 0; i < N; i++) {
		cout << Ans[i] << endl;
	}
}