#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <climits>
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <algorithm>
#include <utility>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#include <functional>

using namespace std;

#define fst first
#define scd second
#define PB push_back
#define MP make_pair
#define all(a) a.begin(),a.end()
#define rall(a) a.rbegin(),a.rend()
#define omajinai ios::sync_with_stdio(false);cin.tie(0)
#define rep(i,x) for(int i=0;i<(int)(x);++i)
#define rep1(i,x) for(int i=1;i<=(int)(x);++i)
#define rrep(i,x) for(int i=(int)x-1;i>=0;--i)
#define rrep1(i,x) for(int i=(int)x;i>=1;--i)

using ll=long long;
using ld=long double;
using vi=vector<int>;
using vvi=vector<vi>;
using pii=pair<int, int>;
using vpii=vector<pii>;

template<class T,class U>ostream&operator<<(ostream&os,const pair<T,U>p){os<<"("<<p.fst<<", "<<p.scd<<")";return os;}
template<class T>ostream&operator<<(ostream&os,const vector<T>v){rep(i,v.size()){if(i)os<<", ";os<<v[i];}return os;}
template<typename T>T&max(T&a,T&b){if(a>=b)return a;return b;}
template<typename T>T&min(T&a,T&b){if(a < b)return a;return b;}
template<typename T>bool chmax(T&a,T b){if(a < b){a=b;return true;}return false;}
template<typename T>bool chmin(T&a,T b){if(a > b){a=b;return true;}return false;}
constexpr ll TEN(int n){return n==0?1:10*TEN(n-1);}

constexpr ll inf = TEN(9)+5;
constexpr ll linf = 3*TEN(18);

const int mod = TEN(9) + 7;

int N, A, B, C;
vector<string> op;
vector<char> ans;

signed main()
{
	cin >> N >> A >> B >> C;
	rep(i, N) {
		string s; cin >> s;
		op.emplace_back(s);
	}

	bool f = true;

	if (A + B + C <= 1) {
		rep(i, N) {
			if (op[i] == "AB") {
				if (A == 0 and B == 0) {
					f = false;
				} else if (A > 0) {
					A--;
					B++;
					ans.PB('B');
				} else {
					B--;
					A++;
					ans.PB('A');
				}
			}
			if (op[i] == "AC") {
				if (A == 0 and C == 0) {
					f = false;
				} else if (A > 0) {
					A--;
					C++;
					ans.PB('C');
				} else {
					C--;
					A++;
					ans.PB('A');
				}
			}
			if (op[i] == "BC") {
				if (B == 0 and C == 0) {
					f = false;
				} else if (B > 0) {
					B--;
					C++;
					ans.PB('C');
				} else {
					C--;
					B++;
					ans.PB('B');
				}
			}
		}
	} else {
		f = false;

		if (op[0] == "AB" and (A > 0 or B > 0)) f = true;
		if (op[0] == "AC" and (A > 0 or C > 0)) f = true;
		if (op[0] == "BC" and (B > 0 or C > 0)) f = true;

		if (f) {
			rep(i, N) {
				if (op[i] == "AB") {
					if (A == 0 and B == 0) f = false;

					if (A * B == 1) {
						if (i + 1 < N) {
							if (op[i + 1] == "BC") {
								B++, ans.PB('B');
								A--;
							} else {
								A++, ans.PB('A');
								B--;
							}
						}

						continue;
					}
					
					if (A >= B) {
						B++, ans.PB('B');
						A--;
					} else {
						A++, ans.PB('A');
						B--;
					}
				}
				if (op[i] == "AC") {
					if (A == 0 and C == 0) f = false;

					if (A * C == 1) {
						if (i + 1 < N) {
							if (op[i + 1] == "BC") {
								C++, ans.PB('C');
								A--;
							} else {
								A++, ans.PB('A');
								C--;
							}

							continue;
						}
					}
					
					if (A >= C) {
						C++, ans.PB('C');
						A--;
					} else {
						A++, ans.PB('A');
						C--;
					}
				}
				if (op[i] == "BC") {
					if (B == 0 and C == 0) f = false;

					if (B * C == 1) {
						if (i + 1 < N) {
							if (op[i + 1] == "AB") {
								B++, ans.PB('B');
								C--;
							} else {
								C++, ans.PB('C');
								B--;
							}
						}

						continue;
					}
					
					if (B >= C) {
						C++, ans.PB('C');
						B--;
					} else {
						B++, ans.PB('B');
						C--;
					}
				}
			}
		}
	}

	if (f) {
		puts("Yes");
		rep(i, N) printf("%c\n", ans[i]);
	} else {
		puts("No");
	}
}


Measured memory_bytes: 7472