public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String[] input = scanner.nextLine().split(" ");
scanner.close();
// 创建一个数组来存储每种牌的数量,索引对应牌的大小
// 索引0-2不使用,索引3-15分别对应3-A和2
int[] cards = new int[16];
// 解析输入,将牌转换为数值并计数
for (String card : input) {
int value;
if (card.equals("J")) {
value = 11;
} else if (card.equals("Q")) {
value = 12;
} else if (card.equals("K")) {
value = 13;
} else if (card.equals("A")) {
value = 14;
} else if (card.equals("2")) {
value = 15; // 2是最大的牌,但不能作为顺子的一部分
} else {
value = Integer.parseInt(card);
}
cards[value]++;
}
// 存储所有找到的顺子
List<List<Integer>> allStraights = new ArrayList<>();
// 尝试所有可能的起始点(从3到10)
// 10是可能的最大起始点,因为要形成至少5张牌的顺子
for (int start = 3; start <= 10; start++) {
// 检查从start开始的最长连续序列
List<Integer> currentStraight = new ArrayList<>();
// 从起始点开始,尝试添加连续的牌
for (int i = start; i <= 14; i++) { // 最大到A(14)
if (cards[i] > 0) {
currentStraight.add(i);
} else {
break; // 如果遇到没有的牌,就停止当前顺子的扩展
}
}
// 如果找到的连续牌至少有5张,则是一个有效的顺子
if (currentStraight.size() >= 5) {
allStraights.add(currentStraight);
}
}
// 按顺子的第一张牌的大小排序
Collections.sort(allStraights, Comparator.comparing(list -> list.get(0)));
// 输出结果
if (allStraights.isEmpty()) {
System.out.println("NO");
} else {
for (List<Integer> straight : allStraights) {
StringBuilder sb = new StringBuilder();
for (int card : straight) {
if (card == 11) {
sb.append("J ");
} else if (card == 12) {
sb.append("Q ");
} else if (card == 13) {
sb.append("K ");
} else if (card == 14) {
sb.append("A ");
} else {
sb.append(card).append(" ");
}
}
System.out.println(sb.toString().trim());
}
}
}
}