#include <bits/stdc++.h>
using namespace std;
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
#define mod 1000000007
#define mod1 998244353
#define lli long long int
#define plli pair<lli,lli>
#define REP(i,a,b) for(lli i=a;i<b;i++)
#define REPI(i,a,b) for(lli i=b-1;i>=a;i--)
#define F first
#define S second
#define PB push_back
#define DB pop_back
#define MP make_pair
#define MT make_tuple
#define G(a,b) get<a>(b)
typedef vector<plli> vii; // three data type shortcuts. They may look cryptic
typedef vector<lli> vi;

#define o_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
#define o_setlli tree<lli, null_type,less<lli>, rb_tree_tag,tree_order_statistics_node_update>
#define o_multiset tree<int,null_type,std::less_equal<int>,rb_tree_tag,tree_order_statistics_node_update>
#define o_multisetlli tree<lli,null_type,std::less_equal<lli>,rb_tree_tag,tree_order_statistics_node_update>
//member functions :
//1. order_of_key(k) : number of elements strictly lesser than k
//2. find_by_order(k) : k-th element in the set
 
lli modI(lli a, lli m);
lli gcd(lli a, lli b);
lli powM(lli x, unsigned lli y, unsigned lli m);
void pairsort(int a[], int b[], int n);
void pairsortlli(lli a[],lli b[],lli n);
lli logint(lli x,lli y);
void Miden(lli **p1,lli n);
void Mmult(lli **p1,lli **p2,lli **ans,lli x,lli y,lli z,lli m);
void Mpow(lli **p1,lli **ans,lli n,lli y,lli m);
plli Egcd(lli x,lli y);
#define LSOne(S) (S & (-S))
#define kira ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
 
class FenwickTree {
private:
  vector<lli> ft;
 
public:
  FenwickTree() {}
  // initialization: n + 1 zeroes, ignore index 0
  FenwickTree(lli n) { ft.assign(n + 1, 0); }
 
  lli rsq(lli b) {                                     // returns RSQ(1, b)
    lli sum = 0; for (; b; b -= LSOne(b)) sum += ft[b];
    return sum; }
 
  lli rsq(lli a, lli b) {                              // returns RSQ(a, b)
    return rsq(b) - (a == 1 ? 0 : rsq(a - 1)); }
 
  // adjusts value of the k-th element by v (v can be +ve/inc or -ve/dec)
  void adjust(lli k, lli v) {                    // note: n = ft.size() - 1
    for (; k < (lli)ft.size(); k += LSOne(k)) ft[k] += v; }
};
 
class UnionFind {                                              // OOP style
public:
  vector<lli> p, rank, setSize;                       // remember: vi is vector<int>
  lli numSets;
  UnionFind(lli N) {
    setSize.assign(N, 1); numSets = N; rank.assign(N, 0);
    p.assign(N, 0); for (lli i = 0; i < N; i++) p[i] = i; }
  lli findSet(lli i) { return (p[i] == i) ? i : (p[i] = findSet(p[i])); }
  bool isSameSet(lli i, lli j) { return findSet(i) == findSet(j); }
  void unionSet(lli i, lli j) { 
    if (!isSameSet(i, j)) { numSets--; 
    lli x = findSet(i), y = findSet(j);
    // rank is used to keep the tree short
    if (rank[x] > rank[y]) { p[y] = x; setSize[x] += setSize[y]; }
    else                   { p[x] = y; setSize[y] += setSize[x];
                             if (rank[x] == rank[y]) rank[y]++; } } }
  lli numDisjointSets() { return numSets; }
  lli sizeOfSet(lli i) { return setSize[findSet(i)]; }
};
 
lli gcd(lli x,lli y)
{
    if(x==0) return y;
    return gcd(y%x,x);
}
 
plli Egcd(lli x,lli y)
{
    if(x==0) return MP(0,1);
    plli t=Egcd(y%x,x);
    return MP(t.S-t.F*(y/x),t.F);
}
 
lli power(lli x,lli y,lli p)
{
  lli res=1;
  x=x%p;
  while(y>0)
  {
    if(y&1)
      res=(res*x)%p;
    //y must be even now
    y=y>>1; //y=y/2
    x=(x*x)%p;
  }
  return res;
}
 
lli modI(lli a, lli m)
{
    lli m0=m,y=0,x=1;
    if(m==1) return 0;
    while(a>1)
    {
        lli q=a/m;
        lli t=m;
        m=a%m;
        a=t;
        t=y;
        y=x-q*y;
        x=t;
    }
    if(x<0) x+=m0;
    return x;
}
 
void pairsort(int a[],int b[],int n)
{
    pair<int,int> v[n];
    REP(i,0,n)
    {
        v[i].F=a[i];
        v[i].S=b[i];
    }
    sort(v,v+n);
    REP(i,0,n)
    {
        a[i]=v[i].F;
        b[i]=v[i].S;
    }
}
 
void pairsortlli(lli a[],lli b[],lli n)
{
    pair<lli,lli> v[n];
    REP(i,0,n)
    {
        v[i].F=a[i];
        v[i].S=b[i];
    }
    sort(v,v+n);
    REP(i,0,n)
    {
        a[i]=v[i].F;
        b[i]=v[i].S;
    }
}
 
lli logint(lli x,lli y)
{
    lli ans=0;
    lli a=1;
    for(lli i=0;i<=x;i++)
    {
        if(x<a)
        {
            return ans;
        }
        ans++;
        a*=y;
    }
    return -1;
}
 
void Miden(lli **p1,lli n)
{
    lli (*x)[n]=(lli(*)[n]) p1;
    REP(i,0,n)
    {
        REP(j,0,n)
        {
            x[i][j]=0;
        }
        x[i][i]=1;
    }
    return;
}
 
void Mmult(lli **p1,lli **p2,lli **ans,lli x,lli y,lli z,lli m)
{
    lli (*a)[y]=(lli (*)[y])p1;
    lli (*b)[z]=(lli (*)[z])p2;
    lli (*c)[z]=(lli (*)[z])ans;
    REP(i,0,x)
    {
        REP(j,0,z)
        {
            c[i][j]=0;
            REP(k,0,y)
            {
                c[i][j]+=a[i][k]*b[k][j];
                c[i][j]%=m;
            }
        }
    }
    return;
}
 
void Mpow(lli **p1,lli **ans,lli n,lli y,lli m)
{
    if(y==0)
    {
        Miden(ans,n);
        return;
    }
    lli t[n][n];
    Mpow(p1,(lli **)t,n,y/2,m);
    lli z[n][n];
    Mmult((lli **)t,(lli **)t,(lli **)z,n,n,n,m);
    if(y%2)
    {
        Mmult((lli **)z,p1,ans,n,n,n,m);
    }
    else
    {
        Miden((lli **)t,n);
        Mmult((lli **)z,(lli **)t,ans,n,n,n,m);
    }
    return;
}

bool cmp(pair<lli,plli> p1,pair<lli,plli> p2)
{
    if(p1.S.F-p1.F>p2.S.F-p2.F)
    return true;
    return false;
}

 int main()
{
  /*ifstream stdin;
    stdin.open("taming.in");
    ofstream stdout;
    stdout.open("taming.out");*/
    kira;
    lli t;
    t=1;
    //cin>>t;
    while(t--)
    {
       /*lli n;
       cin>>n;
       vector<pair<lli,plli>> v;
       vector<lli> v1;
       string p;
       for(lli i1=0;i1<n;i1++)
       {
           cin>>p;
           lli p1=0,c=0;
           for(lli i=0;i<p.length();i++)
           {
               if(p[i]=='(')
               {
                   c++;
               }
               else
               {
                   if(c!=0)
                   c--;
                   else
                   p1++;
               }
           }
           if(p1==0&&c==0)
           {
               v1.PB(i1+1);
               continue;
           }
           v.PB({p1,{c,i1+1}});
       }
       sort(v.begin(),v.end(),cmp);
       multiset<pair<lli,plli>> s;
       lli k=v.size();
       for(lli i=0;i<v.size();i++)
       {
           if(v[i].S.F-v[i].F>=0)
           {
               s.insert({v[i].F,{v[i].S.F,v[i].S.S}});
           }
           else
           {
               k=i;
               break;
           }
       }
       lli s1=0;
       for(auto i:s)
       {
           if(s1-i.F<0)
           {
               cout<<"NO"<<'\n';
               return 0;
           }
           v1.PB(i.S.S);
           s1=s1-i.F+i.S.F;
       }
       multiset<pair<lli,plli>,greater<pair<lli,plli>>> s2;
       for(lli i=k;i<v.size();i++)
       {
           s2.insert({v[i].S.F,{v[i].F,v[i].S.S}});
       }
       for(auto i:s2)
       {
           if(s1-i.S.F<0)
           {
               cout<<"NO"<<'\n';
               return 0;
           }
           v1.PB(i.S.S);
           s1=s1-i.S.F+i.F;
       }
       if(s1!=0)
       cout<<"NO"<<'\n';
       else
       {
           cout<<"YES"<<'\n';
           REP(i,0,v1.size())
           cout<<v1[i]<<" ";
           cout<<'\n';
       }*/
       lli n,a[3];
       cin>>n>>a[0]>>a[1]>>a[2];
       string s[n];
       REP(i,0,n)
       cin>>s[i];
       vector<char> v;
       for(lli i=0;i<n;i++)
       {
           if(a[0]<0||a[1]<0||a[2]<0)
           {
               cout<<"No"<<'\n';
               return 0;
           }
           if(a[s[i][0]-'A']==1&&a[s[i][1]-'A']==1)
           {
               if(i!=n-1&&s[i+1]!=s[i])
               {
                   if(s[i][0]==s[i+1][0]||s[i][0]==s[i+1][1])
                   {
                       a[s[i][1]-'A']--;
                       a[s[i][0]-'A']++;
                       v.PB(s[i][0]);
                   }
                   else
                   {
                       a[s[i][1]-'A']++;
                       a[s[i][0]-'A']--;
                       v.PB(s[i][1]);
                   }
               }
               else
               {
                   a[s[i][1]-'A']++;
                   a[s[i][0]-'A']--;
                   v.PB(s[i][1]);
               }
               continue;
           }
           if(a[s[i][0]-'A']>=a[s[i][1]-'A'])
           {
               a[s[i][0]-'A']--;
               a[s[i][1]-'A']++;
               v.PB(s[i][1]);
           }
           else
           {
               a[s[i][1]-'A']--;
               a[s[i][0]-'A']++;
               v.PB(s[i][0]);
           }
       }
       if(a[0]<0||a[1]<0||a[2]<0)
       cout<<"No"<<'\n';
       else
       {
           cout<<"Yes"<<'\n';
           REP(i,0,v.size())
           cout<<v[i]<<'\n';
       }
    }
}

Measured memory_bytes: 6940