program prob6
    implicit none
    character(5005) :: s
    character(5) :: t
    integer :: K
    character(5), dimension(:), allocatable :: a
    integer :: i, j, L, cnt
    read(*,*) s
    read(*,*) K

    L = len_trim(s)
    allocate(a(L*K))
    do i = 1, L
        do j = 1, K
            a(L*(j-1)+i) = adjustl(s(i:i+j-1))
        end do
    end do

    call msort(a)
    cnt = 1
    i = 2
    t = a(1)
    do while(cnt < K)
        if(t /= a(i)) then
            t = a(i)
            cnt = cnt + 1
        end if
        i = i + 1
    end do

    write(*,'(a)') trim(adjustl(t))
    stop
contains

  !
  ! swap two arguments
  !
subroutine swap(a, b)
    implicit none
    character(5), intent(inout) :: a, b

    character(5) :: c

    c = a
    a = b
    b = c

  end subroutine swap

  !
  ! merge sort
  !
  recursive subroutine msort(x)
    implicit none
    character(5), intent(inout) :: x(:)

    integer(8) :: n, mid, i, j, k
    character(5), allocatable :: tmp(:)
    
    n = size(x)
    
    if(n == 1) then
      return
    end if

    !
    ! 前半と後半に分けてソート
    ! 1~midとmid+1~nをそれぞれソート済みにする
    !
    mid = n / 2
    call msort(x(:mid))
    call msort(x(mid+1:))

    !
    ! tmpという配列にxを一時的に保管
    ! マージソートは外部ソート
    !
    allocate(tmp(n))
    tmp = x

    ! tmpの後半部分を左右反転
    do k = n, mid+1, -1
      tmp(k) = x(mid + n - k + 1)
    end do

    ! iは前半のリストのうちまだ見ていないものの最小値
    ! jは後半のリストのうちまだ見ていないものの最小値
    ! kは見た回数の合計
    i = 1
    j = n

    do k = 1, n
      !
      ! 一番左と一番右のうち小さい方をxに入れていく
      ! ここが等号つき不等号なので、安定ソートとなる
      !
      if(tmp(i) <= tmp(j)) then
        x(k) = tmp(i)
        i = i + 1
      else
        x(k) = tmp(j)
        j = j - 1
      end if
    end do
    
    deallocate(tmp)
    return
  end subroutine msort
end program prob6