#include        "algorithm"
#include        "iostream"
#include        "numeric"
#include        "iomanip"
#include        "cstring"
#include        "math.h"
#include        "bitset"
#include        "string"
#include        "vector"
#include        "ctime"
#include        "queue"
#include        "stack"
#include        "map"
#include        "set"

#include        "ext/pb_ds/assoc_container.hpp" // Common file
#include        "ext/pb_ds/tree_policy.hpp" // Including tree_order_statistics_node_update
#include        "ext/pb_ds/detail/standard_policies.hpp"

using namespace std;
using namespace __gnu_pbds;


#define          f first
#define          lgn 25
#define          endl '\n'
#define          sc second
#define          pb push_back
#define          N (int)2e5+5
#define          PI acos(-1.0)
#define          int long long 
#define          vi vector<int>
#define          mod 1000000007
#define          ld long double
#define          eb emplace_back
#define          mii map<int,int>
#define          vpii vector<pii>
#define          pii pair<int,int>
#define          pq priority_queue
#define          BLOCK (int)sqrt(N)
#define          test(x) while(x--)
#define          all(x) begin(x),end(x)
#define          allr(x) x.rbegin(),x.rend()
#define          fo(i,a,n) for(int i=a;i<n;i++)
#define          rfo(i,n,a) for(int i=n;i>=a;i--)
#define          FAST ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define          time() cerr << "Time : " << (double)clock() / (double)CLOCKS_PER_SEC << "s\n"
#define 		 bug(...)       __f (#__VA_ARGS__, __VA_ARGS__)

typedef tree< int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update > 
OS ;

template <typename Arg1>
void __f (const char* name, Arg1&& arg1) { cout << name << " : " << arg1 << endl; }
template <typename Arg1, typename... Args>
void __f (const char* names, Arg1&& arg1, Args&&... args)
{
     const char* comma = strchr (names + 1, ',');
     cout.write (names, comma - names) << " : " << arg1 << " | "; __f (comma + 1, args...);
}

const int inf = 0x3f3f3f3f;
const int INF = 0x3f3f3f3f3f3f3f3f;

enum x
{
	a , b , c
};

int n , A , B , C;
string s[N];
mii mp;
string ans;
int dp[N][4];

int makeAns(int i = 1 , int na = A , int nb = B , int nc = C , int now = 0)
{
	if( na < 0 or nb < 0 or nc < 0 ) return 0;
	if( i == n + 1) return ( na >= 0 and nb >= 0 and nc >= 0 );

	int& res = dp[i][now];
	if( ~res ) res;

	res = 0;

	if( s[i] == "AB" )
	{
		if( na - 1 >= 0 )
		{
			bool ok = makeAns( i+1 , na - 1 , nb + 1 , nc , b);
			if( ok )
			{
				ans[i] = 'B';
				return res = 1;
			}
		}
		if( nb - 1 >= 0 )
		{
			bool ok = makeAns( i+1 , na + 1 , nb - 1 , nc , a);
			if( ok )
			{
				ans[i] = 'A';
				return res = 1;
			}			
		}
	}

	if( s[i] == "AC" )
	{
		if( na - 1 >= 0 )
		{
			bool ok = makeAns( i+1 , na - 1 , nb , nc + 1 , c);
			if( ok )
			{
				ans[i] = 'C';
				return res = 1;
			}
		}
		if( nc - 1 >= 0 )
		{
			bool ok = makeAns( i+1 , na + 1, nb , nc - 1 , a);
			if( ok )
			{
				ans[i] = 'A';
				return res = 1;
			}			
		}
	}

	if( s[i] == "BC" )
	{
		if( nb - 1 >= 0 )
		{
			bool ok = makeAns( i+1 , na , nb - 1  , nc + 1 , c );
			if( ok )
			{
				ans[i] = 'C';
				return res = 1;
			}			
		}
		if( nc - 1 >= 0 )
		{
			bool ok = makeAns( i+1 , na  , nb + 1 , nc - 1 , b);
			if( ok )
			{
				ans[i] = 'B';
				return res = 1;
			}			
		}
	}

	return res;
}

void go()
{
	cin >> n >> A >> B >> C;

	ans.assign(n + 1 , '.' );
	fo(i,1,n+1)
	{
		cin >> s[i];

		if( s[i] == "AB" ) mp[a]++ , mp[b]++;
		if( s[i] == "AC" ) mp[a]++ , mp[c]++;
		if( s[i] == "BC" ) mp[b]++ , mp[c]++;
	}

	memset( dp , -1 , sizeof dp );
	bool can = makeAns();

	if( can ) 
	{
		cout << "Yes\n";

		fo(i,1,n+1) if( ans[i] != '.' ) cout << ans[i] << endl;
	}
	else cout << "No\n";
}

int32_t main()
{
	FAST;     
	int t=1; 
	// cin>>t;
	test(t) go();
}

 

Measured memory_bytes: 24072