#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

/* 解説に倣って作ってみた */

int main(){

    bool debug = false;
    int debug_i = 0;

    int n;             // n回の選択 1< = n =< 10^5
    map<char, ll> mp;  // 0 =< A,B,C =< 10^9
    cin >> n >> mp['A'] >> mp['B'] >> mp['C'];

    char now[2], next[2]; // 制約としてAB AC BC しかない
    string si;
    string jdg = "Yes";
    //char ans[n];
    vector<char> ans;
    bool flag = true;

    cin >> si;
    now[0] = si.at(0);
    now[1] = si.at(1);

    if(n == 1){ //選択が1回の時はここで済ます
        if(mp[now[0]]>0){
            mp[now[0]]--;
            mp[now[1]]++;
            ans.push_back(now[1]);        
        }else if(mp[now[1]]>0){
            mp[now[1]]--;
            mp[now[0]]++;
            ans.push_back(now[0]);
        }else{
            jdg = "No";
        }
        flag = false;
    }else if(mp['A'] + mp['B'] + mp['C'] == 0){
        jdg = "No";
        flag = false;
    }

    // メイン処理 **********************************************    
    for(int i=0; i<n-1; i++){
        if(!flag){//もうダメ判定なら読むだけで終わり
            cin >> si;
        }else{
            cin >> si;
            next[0] = si.at(0);
            next[1] = si.at(1);
                
            if(mp[now[0]]==0 && mp[now[1]]==0){
                jdg = "No";
                flag = false;
                //if(debug) debug_i = i; //**********************debug
            }else if(mp[now[0]]==0){
                mp[now[0]]++;
                mp[now[1]]--;
                ans.push_back(now[0]);
            }else if(mp[now[1]]==0){
                mp[now[1]]++;
                mp[now[0]]--;
                ans.push_back(now[1]);
            }else if(mp[now[0]]==1 && mp[now[1]]==1){
                if(now[0] == next[0] && now[1] == next[1]){
                    mp[now[0]]++; //ここはどちらでもよい
                    mp[now[1]]--;
                    ans.push_back(now[0]);
                } else{
                    if(now[0] == next[0]){ //つまりAが重複
                        mp['A']++;
                        mp[now[1]]--;
                        ans.push_back('A');
                    }else if(now[1] == next[1]){//つまりCが重複
                        mp['C']++;
                        mp[now[0]]--;
                        ans.push_back('C');
                    }else{
                        mp['B']++;
                        ans.push_back('B');
                        if(now[0] == 'B'){
                            mp[now[1]]--;
                        }else{
                            mp[now[0]]--;
                        }
                    }

                }
            }else{ //改造、大きいほうから引くこととする
                if(mp[now[0]] > mp[now[1]]){
                    mp[now[1]]++; //ここはどちらでもよい
                    mp[now[0]]--;
                    ans.push_back(now[1]);
                }else{
                    mp[now[0]]++; //ここはどちらでもよい
                    mp[now[1]]--;
                    ans.push_back(now[0]);
                }
            }

            now[0] = next[0];
            now[1] = next[1];

            //******************************************
            //    cout << " Tern:" << i+1 << " " << ans.at(i);
            //   cout << " A=" << mp['A'];
            //    cout << " B=" << mp['B'];
            //    cout << " C=" << mp['C'];
            //    cout << endl;  
            //******************************************
        }
        
    }

    //最終ターン **********************************************
    if(flag){
        if(mp[now[0]]>0){
            mp[now[0]]--;
            mp[now[1]]++;
            ans.push_back(now[1]);        
        }else if(mp[now[1]]>0){
            mp[now[1]]--;
            mp[now[0]]++;
            ans.push_back(now[0]);
        }else{
            jdg = "No";
        }
    }

    cout << jdg << endl;
    if(jdg == "Yes"){
        for(long unsigned int i=0; i<ans.size(); i++){
            cout << ans.at(i) << endl;
        }
    }
    if(debug) cout << debug_i <<endl; 


    return 0;
}

Measured memory_bytes: 3760