import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int num=sc.nextInt();
String[] str=new String[num+1];
//堆排序第一个字符串是换行符
sc.nextLine();
//队排序从第一个元素开始要不 i=0 i*2=0
for(int i=1;i<=num;i++){
str[i]=sc.nextLine();
}
//堆排序
duisort(str);
}
//堆排序
static void duisort(String[] str){
//先建立小根堆
int last=(str.length-1)/2;
for(int i=last;i>0;i--){
singlesort(str,i,str.length);
}
int len=str.length;
while(len>1){
System.out.println(str[1]);
//最后一个元素提到str[0]
str[1]=str[len-1];
len--;
singlesort(str,1,len);
}
}
//下坠 比较
//last是元素个数
static void singlesort(String[] str,int i,int last){
String min;int minindex,res;
//
while(i*2<last){
if(i*2+1<last){
res= sort(str[i*2],str[i*2+1]);//1为小
//不要再[]内写表达式
// res==1?max=str[left]:max=str[right];
// res==1?maxindex=i*2:maxindex=i*2+1;
if(res==1){
min=str[i*2];
minindex=i*2;
}else{
min=str[i*2+1];
minindex=i*2+1;
}
}
else{
min=str[i*2];
minindex=i*2;
}
res=sort(min,str[i]);
if(res==1){
str[minindex]=str[i];
str[i]=min;
i=minindex;
}
else return;
}
}
static int sort(String str1,String str2){
int i1=0,i2=0;
int len1=str1.length();
int len2=str2.length();
while(i1<len1&&i2<len2){
if(str1.charAt(i1)<str2.charAt(i2)) return 1;
else if(str1.charAt(i1)>str2.charAt(i2)) return -1;
else if(str1.charAt(i1)==str2.charAt(i2)){
i1++;
i2++;
}
}
if(i1==len1&&i2==len2) return 1;
//先达到长度的长度小
else return i1==len1?1:-1;
}
}