implicit none
integer(8):: n, i, ans, k, x, y, z, j
integer(8),allocatable,dimension(:):: a,b,c,d,e

read (5,*) x,y,z,n

allocate(a(x))
allocate(b(y))
allocate(c(z))
allocate(d(x*y))
allocate(e(min(x*y, 3000) * z))

d = 0
e = 0
read(5,*) (a(i),i=1,x)
read(5,*) (b(i),i=1,y)
read(5,*) (c(i),i=1,z)


do i = 1, x
    do j = 1, y
        d( (i-1) * y + j ) = a(i) + b(j)
    enddo
enddo

call heapsort(x,c)
call heapsort(x*y,d)


do i = x*y, max(x*y-3000+1, 1), -1
    do j = 1, z
        e((x*y-i) * z + j ) = d(i) + c(j)
    enddo
enddo
 
 
call heapsort(min(x*y, 3000) * z, e)

do i = min(x*y, 3000) * z,  min(x*y, 3000) * z - n +1, -1
    write(6,*) e(i)
enddo
 
 

end
 
!---http://slpr.sakura.ne.jp/qp/sortf90/---
subroutine heapsort(n,array)
    implicit none
    integer(8),intent(in) :: n
    double precision,intent(inout) :: array(1:n)
 
    integer ::i,k,j,l
    double precision :: t
 
    if(n.le.0)then
        write(6,*)"Error, at heapsort"; stop
    endif

    if(n.eq.1)return 
        l=n/2+1
        k=n
        do while(k.ne.1)
            if(l.gt.1)then
                l=l-1
                t=array(L)
            else
                t=array(k)
                array(k)=array(1)
                k=k-1
                if(k.eq.1) then
                    array(1)=t
                    exit
                endif
            endif
            i=l
            j=l+l
            do while(j.le.k)
                if(j.lt.k)then
                    if(array(j).lt.array(j+1))j=j+1
                endif
                if (t.lt.array(j))then
                    array(i)=array(j)
                    i=j
                    j=j+j
                else
                    j=k+1
                endif
            enddo
            array(i)=t
    enddo
    return
end subroutine heapsort