// Author: Tyler Wang

#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>
#include <cctype>
#include <chrono>
#include <cmath>
#include <cstdint>
#include <cstdlib>
#include <deque>
#include <functional>
#include <initializer_list>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <limits>
#include <map>
#include <memory>
#include <numeric>
#include <optional>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <string>
#include <string_view>
#include <tuple>
#include <type_traits>
#include <utility>
#include <vector>

using namespace std;

template <typename T>
std::ostream& operator<<(std::ostream& os, const std::optional<T>& opt) {
  return opt ? os << *opt : os << "nullopt";
}

template <typename T1, typename T2>
std::ostream& operator<<(std::ostream& os, const std::pair<T1, T2>& p) {
  return os << '{' << p.first << ", " << p.second << '}';
}

template <typename Container,
          std::enable_if_t<!std::is_convertible_v<Container, std::string_view>,
                           typename Container::const_iterator>* = nullptr>
std::ostream& operator<<(std::ostream& os, const Container& c) {
  os << '{';
  if (!c.empty()) {
    auto it = c.begin();
    os << *it;
    while (++it != c.end()) {
      os << ", " << *it;
    }
  }
  return os << '}';
}

template <typename T, typename Container>
std::ostream& operator<<(std::ostream& os, std::stack<T, Container> s) {
  std::vector<T> v(s.size());
  for (auto it = v.rbegin(); it != v.rend(); ++it) {
    *it = s.top();
    s.pop();
  }
  return os << v;
}

template <typename T, typename Container>
std::ostream& operator<<(std::ostream& os, std::queue<T, Container> q) {
  os << '{';
  if (!q.empty()) {
    os << q.front();
    q.pop();
    while (!q.empty()) {
      os << ", " << q.front();
      q.pop();
    }
  }
  return os << '}';
}

template <typename T, typename Container, typename Compare>
std::ostream& operator<<(std::ostream& os,
                         std::priority_queue<T, Container, Compare> pq) {
  os << '{';
  if (!pq.empty()) {
    os << pq.top();
    pq.pop();
    while (!pq.empty()) {
      os << ", " << pq.top();
      pq.pop();
    }
  }
  return os << '}';
}

namespace detail {

template <int I, typename... Ts>
void tuple_print(std::ostream& os, const std::tuple<Ts...>& t) {
  static_assert(0 <= I && I <= sizeof...(Ts));
  if constexpr (I != sizeof...(Ts)) {
    if constexpr (I != 0) {
      os << ", ";
    }
    os << std::get<I>(t);
    tuple_print<I + 1>(os, t);
  }
}

}  // namespace detail

template <typename... Ts>
std::ostream& operator<<(std::ostream& os, const std::tuple<Ts...>& t) {
  os << '{';
  detail::tuple_print<0>(os, t);
  return os << '}';
}

namespace detail {

template <typename T>
void debug_print(std::string_view key, const T& val) {
  std::cerr << key << " = " << val << std::endl;
}

template <typename T1, typename... Ts>
void debug_print(std::string_view keys, const T1& val1, const Ts&... vals) {
  for (int i = 0, paren = 0; i < (int)keys.size(); ++i) {
    if (keys[i] == '(' || keys[i] == '{') {
      ++paren;
    } else if (keys[i] == ')' || keys[i] == '}') {
      --paren;
    } else if (keys[i] == ',' && paren == 0) {
      std::cerr << keys.substr(0, i) << " = " << val1 << ',';
      return debug_print(keys.substr(i + 1), vals...);
    }
  }
}

void debug_print(int line, std::string_view) {
  std::cerr << "  " << line << " |" << std::endl;
}

template <typename... Ts>
void debug_print(int line, std::string_view keys, const Ts&... vals) {
  std::cerr << "  " << line << " | ";
  debug_print(keys, vals...);
}

}  // namespace detail

#ifdef TYLER
#define debug(...) \
  detail::debug_print(__LINE__, #__VA_ARGS__ __VA_OPT__(, ) __VA_ARGS__)
#else
#define debug(...) ((void)0)
#endif

template <class Fun>
class y_combinator_result {
 public:
  template <class T>
  explicit y_combinator_result(T&& fun) : fun_(std::forward<T>(fun)) {}

  template <class... Args>
  decltype(auto) operator()(Args&&... args) {
    return fun_(std::ref(*this), std::forward<Args>(args)...);
  }

 private:
  Fun fun_;
};

template <class Fun>
decltype(auto) y_combinator(Fun&& fun) {
  return y_combinator_result<std::decay_t<Fun>>(std::forward<Fun>(fun));
}

int main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  std::cout.precision(12);
  std::cerr.precision(12);
  std::mt19937 rng((std::uint_fast32_t)std::chrono::high_resolution_clock::now()
                       .time_since_epoch()
                       .count());
  array<int, 3> a;
  int n;
  cin >> n;
  for (int i = 0; i < 3; ++i) {
    cin >> a[i];
  }
  vector<string> s(n);
  for (int i = 0; i < n; ++i) {
    cin >> s[i];
  }
  bool ok = true;
  string ans;
  for (int i = 0; i < n; ++i) {
    int x = s[i][0] - 'A';
    int y = s[i][1] - 'A';
    auto choose1 = [&]() {
      ++a[x];
      --a[y];
      ans += s[i][0];
    };
    auto choose2 = [&]() {
      ++a[y];
      --a[x];
      ans += s[i][1];
    };
    if (i != n - 1 && a[x] == a[y]) {
      if (s[i + 1].find(s[i][0]) != string::npos) {
        choose1();
      } else {
        choose2();
      }
    } else if (a[x] < a[y]) {
      choose1();
    } else {
      choose2();
    }
    if (*min_element(a.begin(), a.end()) < 0) {
      ok = false;
    }
  }
  if (!ok) {
    cout << "No\n";
    return 0;
  }
  cout << "Yes\n";
  for (char c : ans) {
    cout << c << '\n';
  }
  return 0;
}


Measured memory_bytes: 6700