#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>
#include <cfloat>
#include <chrono>
#include <climits>
#include <cmath>
#include <cstdio>
#include <deque>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <unordered_map>
#include <unordered_set>
#include <vector>
using namespace std;

template <class T1, class T2>
ostream& operator << (ostream& out, const pair <T1, T2> p)
{
	out << '(' << p.first << ',' << p.second << ')';
	return out;
}

template <class T1, class T2>
istream& operator >> (istream& in, pair<T1, T2> &p)
{
	in >> p.first >> p.second;
	return in;
}

template <class T>
istream& operator >> (istream& in, vector<T> &v)
{
	for (T &x : v)
		in >> x;
	return in;
}

template <class T>
ostream& operator << (ostream& out, const vector<vector<T>> &v)
{
	for (const vector<T> &x : v)
		out << x << '\n';
	return out;
}

template <class T>
ostream& operator << (ostream& out, const vector<T> &v)
{
	for (const T &x : v)
		out << x << ' ';
	return out;
}

long long gcd (long long a, long long b)
{
	if (b > a)
		swap(a, b);
	return (b ? gcd(b, a % b) : a);
}

using ll   = long long;
using pii  = pair<int, int>;
using pll  = pair<long long, long long>;
using tiii = pair<pair<int, int>, int>;
using vi   = vector<int>;
using vl   = vector<long long>;
using vvi  = vector<vector<int>>;
using vvl  = vector<vector<long long>>;

#define F          first
#define S          second
#define First      first.first
#define Second     first.second
#define Third      second
#define mp         make_pair
#define rep(i,a,b) for (int i = (a); i < (b); i++)
#define per(i,b,a) for (int i = (b); i > (a); i--)
#define all(x)     x.begin(), x.end()
#define ret(x)     return cout << x, 0;
#define throwex    throw runtime_error ("Found the error.");

const int h = 1000000007;

signed main()
{
	ios::sync_with_stdio(false);
	#ifdef ONLINE_JUDGE
	cin.tie(nullptr);
	cout.tie(nullptr);
	cerr.setstate(ios::failbit);
	#endif

	vl v(3);
	int n;
	cin >> n >> v;

	vector<string> vs(n), rem;
	cin >> vs;

	string ans;
	rep(i,0,n)
	{
		string s = vs[i];
		if(!rem.empty())
		{
			if(s == rem[0])
			{
				ans += s;
				rem.pop_back();
				continue;
			}
			else
			{
				vi z(3);
				for(char x : rem[0])
					z[x-'A']^=1;
				for(char x : s)
					z[x-'A']^=1;
				int c = 0, m = INT_MAX;
				rep(i,0,3)
					if(z[i] and v[i] < m)
					{
						m = v[i];
						c = i;
					}
				v[c]++;
				string f;
				rep(i,0,3)
					if(!z[i])
					{
						f += 'A' + i;
					}
				rep(i,0,3)
					if(z[i] and i != c)
						v[i]--;
				f += 'A' + c;
				if(count(all(s), 'A' + c));
				else
					swap(f[0], f[1]);
				ans += f;
				rem.pop_back();
				cerr << v << '\n';
				continue;
			}
		}
		if(v[s[1]-'A'] != v[s[0]-'A'] or (v[s[1]-'A'] == v[s[0]-'A'] and v[s[0]-'A'] == 0) or i == n - 1)
		{
			int c = 0;
			if(v[s[1]-'A'] < v[s[0]-'A'])
				c = 1;
			if(v[s[!c]-'A'] == 0)
				break;
			v[s[c]-'A']++;
			v[s[!c]-'A']--;
			ans += s[c];
		}
		else
			rem.push_back(s);
	}
	if(ans.size() != n)
		cout << "No\n";
	else
	{
		cout << "Yes\n";
		for(char c : ans)
			cout << c << '\n';
	}
}


Measured memory_bytes: 6664