Problem:
Finding Missing Cards

Taro is going to play a card game. However, now he has only n cards, even though there should be 52 cards (he has no Jokers).

The 52 cards include 13 ranks of each of the four suits: spade, heart, club and diamond.

Input

In the first line, the number of cards n (n ≤ 52) is given.

In the following n lines, data of the n cards are given. Each card is given by a pair of a character and an integer which represent its suit and rank respectively. A suit is represented by 'S', 'H', 'C' and 'D' for spades, hearts, clubs and diamonds respectively. A rank is represented by an integer from 1 to 13.

Output

Print the missing cards. The same as the input format, each card should be printed with a character and an integer separated by a space character in a line.
Arrange the missing cards in the following priorities:

Print cards of spades, hearts, clubs and diamonds in this order.

If the suits are equal, print cards with lower ranks first.

Sample Input

47
S 10
S 11
S 12
S 13
H 1
H 2
S 6
S 7
S 8
S 9
H 6
H 8
H 9
H 10
H 11
H 4
H 5
S 2
S 3
S 4
S 5
H 12
H 13
C 1
C 2
D 1
D 2
D 3
D 4
D 5
D 6
D 7
C 3
C 4
C 5
C 6
C 7
C 8
C 9
C 10
C 11
C 13
D 9
D 10
D 11
D 12
D 13

Sample Output

S 1
H 3
H 7
C 12
D 8

Note

      解説

Solution in JAVA (judge verdict: Wrong Answer)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;

public class Main {

    protected static String process(String data) {
        final Set<Card> cards = populate();

        StringBuilder sb = new StringBuilder();
        final String[] lines = splitForLines(data);

        // skipping first line
        for (int i = 1; i < lines.length; i++) {
            final Card card = Card.valueOf(lines[i]);
            cards.remove(card);
        }

        for (Card card : cards) {
            sb.append(card).append('\n');
        }

        return sb.toString();
    }

    static Set<Card> populate() {
        SortedSet<Card> set = new TreeSet<Card>();
        for (CardType type : CardType.values()) {
            for (int i = 1; i < 13; i++) {
                set.add(new Card(type, i));
            }
        }
        return set;
    }

    enum CardType {
        S, H, C, D
    }

    static class Card implements Comparable<Card> {
        final CardType cardType;
        final int rank;

        public Card(CardType cardType, int rank) {
            this.cardType = cardType;
            this.rank = rank;
        }

        static Card valueOf(String s) {
            final String[] split = s.split(" ");
            return new Card(CardType.valueOf(split[0]), Integer.parseInt(split[1]));
        }

        @Override
        public int compareTo(Card o) {
            final int i = cardType.compareTo(o.cardType);
            if (i != 0) {
                return i;
            }
            return Integer.valueOf(rank).compareTo(o.rank);
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;

            Card card = (Card) o;

            if (rank != card.rank) return false;
            if (cardType != card.cardType) return false;

            return true;
        }

        @Override
        public int hashCode() {
            int result = cardType.hashCode();
            result = 31 * result + rank;
            return result;
        }

        @Override
        public String toString() {
            return cardType + " " + rank;
        }
    }

    private static String readAll(InputStream is) {
        InputStreamReader r = null;
        BufferedReader br = null;

        try {
            r = new InputStreamReader(is);
            br = new BufferedReader(r);
            StringBuilder sb = new StringBuilder();
            String s;

            while ((s = br.readLine()) != null) {
                sb.append(s).append('\n');
            }

            return sb.toString();
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                }
            }
            if (r != null) {
                try {
                    r.close();
                } catch (IOException e) {
                }
            }
        }
    }

    private static String[] splitForLines(String lines) {
        return lines.split("\\n");
    }

    public static void main(String[] args) {
        System.out.println(process(readAll(System.in)));
    }
}