/* aman36 - Aman Raj */

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
 
#define fast_cin() ios :: sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define AfterDecimal(n) cout << fixed << setprecision(n);
#define pb push_back
#define ll long long
#define ld long double
#define all(a) a.begin(), a.end()
#define pll pair<ll, ll>
#define F first
#define S second
#define bits(x) __builtin_popcount(x)
#define fori(n)  for (ll i = 0; i < n; i++)
#define forj(n)  for (ll j = 0; j < n; j++)
#define fork(n)  for (ll k = 0; k < n; k++)
#define forlp(k,x,n)  for (ll k = x; k <= n; k++)
#define vll vector <ll>
#define mll map <ll, ll>
#define vpll vector <pll>
#define mem(x, v) memset(x, v, sizeof(x));
#define int ll
#define endl "\n"
 
using namespace __gnu_pbds;
using namespace std;

template <typename T> using ordered_set =
 tree<T, null_type, less<T>, rb_tree_tag, 
 tree_order_statistics_node_update>;
// order_of_key (k) : Number of items strictly smaller than k .
// find_by_order(k) : K-th element in a set (counting from zero).
// ordered_set <int> os;     *os.order_by_key(k);
 
#ifdef DEBUG
#define debug(...) __f(#__VA_ARGS__, __VA_ARGS__)
template<typename Arg1>
void __f(const char* name, Arg1&& arg1){
    cout << "# "<< name << " = " << arg1 << '\n';
}
template<typename Arg1, typename... Args>
void __f(const char* names, Arg1 && arg1, Args &&... args){
        const char* comma = strchr(names + 1 ,',');
        cout << "# ";
        cout.write(names, comma - names)<< " = " << arg1 << " | ";
        __f(comma + 1, args...);
}
#else
#define debug(...) 36
#endif

ll mxm() {return LLONG_MIN;}
template<typename... Args>
ll mxm(ll a, Args... args) { return max(a,mxm(args...)); }
 
ll mnm() {return LLONG_MAX;}
template<typename... Args>
ll mnm(ll a, Args... args) { return min(a,mnm(args...)); }

template<class T> ostream& operator<<(ostream& os,vector<T> V){
    os<<"[ ";for(auto v:V)os<<v<<" ";return os<<"]";
}
template<class L,class R> ostream& operator<<(ostream& os,pair<L,R> P){
    return os<<"("<<P.first<<","<<P.second<<")";
}

int power(int lx, int ly, int p) { 
    ll res = 1;
    ll x = lx;
    ll y = ly;
    x = x % p;  
    while (y > 0) {
        if (y & 1) 
            res = (res * x) % p; 
        y = y >> 1;
        x = (x * x) % p; 
    }
    return (int)res;
}

bool isPrime(int n) 
{ 
    if (n <= 1) return false; 
    if (n <= 3) return true; 
    if (n % 2 == 0 || n % 3 == 0) return false;  
    for (int i = 5; i * i <= n; i = i + 6) 
        if (n % i == 0 || n % (i + 2) == 0) 
            return false; 
    return true; 
}

const ll INF = (ll)(8e18);
const ll MOD = 1e9 + 7;
const ll MOD2 = 998244353;
// check the limits
const int maxn = 1e6+5;
const int M = 2e5+5;

signed main() {
    fast_cin();
    
    int n, a, b, c;
    cin >> n >> a >> b >> c;

    string s[n];
    fori(n) cin >> s[i];

    vector<char> v; int f = 1;

    map<char, int> mp;
    mp['A'] = a;
    mp['B'] = b;
    mp['C'] = c;

    fori(n) {
        char c1 = s[i][0], c2 = s[i][1];
        
        if(mp[c1] > 0 && mp[c2] > 0) {
            if(mp[c1] > mp[c2]) {
                mp[c1]--;
                mp[c2]++;
                v.pb(c2);
            }
            else if(mp[c2] > mp[c1]) {
                mp[c2]--;
                mp[c1]++;
                v.pb(c1);
            }
            else {
                if(i+1 < n && (s[i+1][0] == c2 || s[i+1][1] == c2) ){
                    mp[c1]--;
                    mp[c2]++;
                    v.pb(c2);
                }
                else {
                    mp[c1]++;
                    mp[c2]--;
                    v.pb(c1);
                }
            }
        }
        else if(mp[c1] > 0 && mp[c2] == 0) {
            mp[c1]--;
            mp[c2]++;
            v.pb(c2);
        }
        else if(mp[c1] == 0 && mp[c2] > 0) {
            mp[c2]--;
            mp[c1]++;
            v.pb(c1);
        }
        else {
            f = 0;
            break;
        }
    }

    if(!f) cout << "No" << endl;
    else {
        cout << "Yes" << endl;
        for(auto x:v) cout << x << endl;
    }

    #ifdef LOCAL
    cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
    #endif

    return 0;
}

// read the question correctly
// read code carefully
// corner cases // int vs ll // cin vs scanf // clear structures // maths
// check max, min set to INT_MAX instead INF
// check constraint 

Measured memory_bytes: 6948