import java.util.Scanner

object Main extends App {
  // def readALine(c:Int, ac:List[Int]):List[Int] =
  //   if (c > 0) readALine(c-1, sc.nextInt::ac) else ac.reverse
  // def readLines(r:Int, c:Int, ac:List[List[Int]]):List[List[Int]] =
  //   if (r > 0) readLines(r-1, c, readALine(c, Nil)::ac) else ac.reverse
  def readLines(r:Int, ac:List[(String,Int)]):List[(String,Int)] =
    if (r > 0) readLines(r-1, (sc.next, sc.nextInt)::ac) else ac
  val sc = new Scanner(System.in)
  val N = sc.nextInt
  val ls = readLines(N, Nil).map(_ match {
      case ("S", r) => ("S", r, 0)
      case ("H", r) => ("H", r, 1)
      case ("C", r) => ("C", r, 2)
      case ("D", r) => ("D", r, 3)
    }).sortWith((a,b) => {
      val (s,t,u) = a
      val (v,w,x) = b
      if (u == x) t < w else u < x
    })

  type Card = (String, Int, Int)

  def solver(ls:List[Card]):List[Card] = {
    val Suits = List("S","H","C","D")
    def suit(ls:List[Card],suits:List[String],ac:List[Card]):List[Card] = {
      if (suits.isEmpty) ac.reverse else {
        var (restCards, lostCards) = rank(ls, suits.head,(1 to 13).toList,ac)
        suit(restCards,suits.tail,lostCards)
      }
    }
    def rank(ls:List[Card],suit:String,ranks:List[Int],ac:List[Card]):(List[Card],List[Card]) = {
      if (ranks.isEmpty) (ls, ac) else {
        if (ls.isEmpty) rank(ls, suit, ranks.tail, (suit,ranks.head,0)::ac)
        else {
          var (s, r, o) = ls.head
          if (suit == s && ranks.head == r) rank(ls.tail, suit, ranks.tail, ac)
          else rank(ls, suit, ranks.tail, (suit,ranks.head,0)::ac)
        } 
      }
    }
    suit(ls,Suits,Nil)
  }

  for (t <- solver(ls)) {
    var (s, r, o) = t
    println(s"$s $r")
  }
}
