import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
// 文件数量
int c = Integer.valueOf(in.nextLine());
List<List<String>> lists = new ArrayList<>();
for (int i = 0; i < c; i++) {
List<String> alist = new ArrayList<>();
String str = in.nextLine();
char[] chars = str.toCharArray();
boolean isNum = false;
String astr = "";
for (char achar : chars) {
// 上一个字符是数字
if (isNum) {
// 这一个还是数字
if (Character.isDigit(achar)) {
astr += achar;
} else {
// 这一个不是数字
if (!astr.equals("")) {
// 把之前的加到list
alist.add(astr);
}
// 置空在加上
astr = "";
astr += achar;
isNum = false;
}
} else { // 上一个不是数字
// 这一个是数字
if (Character.isDigit(achar)) {
if (!astr.equals("")) {
// 把之前的加到list
alist.add(astr);
}
// 置空在加上
astr = "";
astr += achar;
isNum = true;
} else {
astr += achar;
}
}
}
// 如果循环之后 astr 不是空最后要加上
if (!astr.equals("")) {
alist.add(astr);
}
lists.add(alist);
}
lists = lists.stream().sorted((l1, l2)-> {
int len = l1.size() > l2.size() ? l2.size() : l1.size();
for (int i = 0; i < len; i++) {
String s1 = l1.get(i);
String s2 = l2.get(i);
boolean isDigitS1 = Character.isDigit(s1.charAt(0));
boolean isDigitS2 = Character.isDigit(s2.charAt(0));
// 都是数字
if (isDigitS1 && isDigitS2) {
long n1 = Long.parseLong(s1);
long n2 = Long.parseLong(s2);
if (n1 != n2) {
// 如果不相等,那就直接比较他们的大小
return Long.compare(n1, n2);
}
// 相等
// 直接下一个循环
continue;
}
// 都不是数字
if (!isDigitS1 && !isDigitS2) {
if (!s1.equals(s2)) {
return s1.compareTo(s2);
}
// 相等
// 直接下一个循环
continue;
}
// 其中一个是
// 谁是数字谁排前面
return isDigitS1 ? -1 : 1;
}
// 前面比对都一样,那么就判断是不是子序
return Integer.compare(l1.size(), l2.size()); // 大小升序
}).collect(Collectors.toList());
String oneBlock = lists.stream()
.map(inner -> String.join("", inner)) // 子 List 拼一行
.collect(Collectors.joining(System.lineSeparator())); // 行间换行
System.out.println(oneBlock);
}
}