import java.io._
import java.util.StringTokenizer
import scala.util.control.Breaks.{breakable,break}
import scala.collection.mutable.{Map, Stack, Queue, PriorityQueue, Set}

object Main extends App {
  val in = new InputReader(System.in)
  val pw = new PrintWriter(System.out)

  val N = in.next().toInt
  val A, B, C = in.next().toLong
  val s = new Array[String](N+2)
  for (i <- 1 to N) {
    s(i) = in.next()
  }
  val cnt = Array[Long](A, B, C)

  def f(now: String, a: Char): Unit = { // s(i), choice
    val b = now.filter(_ != a)(0)
    a match {
      case 'A' => cnt(0) += 1
      case 'B' => cnt(1) += 1
      case 'C' => cnt(2) += 1
    }
    b match {
      case 'A' => cnt(0) -= 1
      case 'B' => cnt(1) -= 1
      case 'C' => cnt(2) -= 1
    }
  }


  //
  var flag = true
  var ans = new Array[Char](N+1)
  val char = Array[Char]('A','B','C')

  breakable {
    if (cnt.sum == 0)
      flag = false
    else if (cnt.sum == 1) {
      for (i <- 1 to N) {
        val now = s(i)
        var a = '-'

        val (x, y, z) =
          now match {
            case "AB" => (0, 1, 2)
            case "BC" => (1, 2, 0)
            case "AC" => (2, 0, 1)
          }

        if (cnt(x) == 1)
          a = char(y)
        else if(cnt(y) == 1)
          a = char(x)
        else {
          flag = false
          break
        }

        f(now, a)
        ans(i) = a

      }
    }
    else {
      for (i <- 1 to N) {
        val now = s(i)
        var a = '-'

        val (x, y, z) =
          now match {
            case "AB" => (0, 1, 2)
            case "BC" => (1, 2, 0)
            case "AC" => (2, 0, 1)
          }

        if (cnt(x) == 0 && cnt(y) == 0) {
          flag = false
          break
        }
        else if (cnt(x) == 0)
          a = char(x)
        else if (cnt(y) == 0)
          a = char(y)
        else if (cnt(x) == 1 && cnt(y) == 1) {
          if (s(i+1).contains(char(x)))
            a = char(x)
          else
            a = char(y)
        }
        else {
          if (cnt(x) >= cnt(y))
            a = char(y)
          else
            a = char(x)
        }

        f(now, a)
        ans(i) = a
      }
    }
  }

  // output
  if (flag) {
    println("Yes")
    println(ans.drop(1).mkString("\n"))
  }
  else
    println("No")
}

object Sub {
  def print2DimArray[A](mat: Array[Array[A]]): Unit = {
    mat.foreach(lin => println(lin.toList))
  }
}

class InputReader(stream: InputStream) {
  private[this] val reader = new BufferedReader(new InputStreamReader(stream))
  private[this] var tokenizer: StringTokenizer = new StringTokenizer(reader.readLine())
  def next(): String = {
    while (!tokenizer.hasMoreTokens()) {
      tokenizer = new StringTokenizer(reader.readLine())
    }
    tokenizer.nextToken()
  }
}
