module ch
  implicit none
  type char
     character(100)      :: chara
  end type char
  type(char),allocatable :: namec(:)
end module ch
program main
   
  use ch, only : namec 

  implicit none
  integer :: n, l
  character(100) :: ans
  integer, allocatable :: s(:)
  integer :: i,j,k
  
  read(*,*) n, l

  allocate( s(n) )
  allocate( namec(n) )

  do i = 1, n
    read(*,*) namec(i)%chara
  end do

  call quicksort1( 1, n ) 
  
  j = 1
  do i = 1, n
    ans(j:j+l) = trim( namec(i)%chara )
    j = j + l 
  end do
  ans = ans(1:j)
  print*,ans

end program main
recursive subroutine quicksort1( first, last )
!recursive subroutine quicksort1( a%chara, first, last )

  use ch, only : namec 

  implicit none
  integer,intent(in)::first,last
  !type char
  !   character(100) :: chara 
  !end type 
  !type(char),intent(inout)::a(*)
  !
  ! Original
  ! https://gist.github.com/t-nissie/479f0f16966925fa29ea
  !
  character(100)::x,t
  integer::i,j

  x = namec((first+last)/2)%chara
  !x = a((first+last)/2)%chara
  i = first
  j = last
  do
     do while ( LGT( x, namec(i)%chara ) )
     !do while ( LGT( x, a(i)%chara ) )
        i=i+1
     end do
     do while ( LGT( namec(j)%chara, x ) )
     !do while ( LGT( a(j)%chara, x ) )
        j=j-1
     end do
     if (i >= j) exit
     t = namec(i)%chara
     namec(i)%chara = namec(j)%chara
     namec(j)%chara = t
     i=i+1
     j=j-1
  end do
  if (first < i-1) call quicksort1( first, i-1  )
  if (j+1 < last)  call quicksort1( j+1  , last )

  return

end subroutine quicksort1

!recursive subroutine quicksort1(a, first, last )
!  implicit none
!  integer,intent(inout)::a(*)
!  integer,intent(in)::first,last
!  !
!  ! Original
!  ! https://gist.github.com/t-nissie/479f0f16966925fa29ea
!  !
!  integer::x,t
!  integer::i,j
!
!  x = a((first+last)/2)
!  i = first
!  j = last
!  do
!     do while (a(i) < x)
!        i=i+1
!     end do
!     do while (x < a(j))
!        j=j-1
!     end do
!     if (i >= j) exit
!     t = a(i)
!     a(i) = a(j)
!     a(j) = t
!     i=i+1
!     j=j-1
!  end do
!  if (first < i-1) call quicksort1(a, first, i-1)
!  if (j+1 < last)  call quicksort1(a, j+1, last)
!
!  return
!end subroutine quicksort1

