#백준2798번
n,m=map(int,input().split())
lst=[]
for i in input().split():
lst.append(int(i))
#입력받은 n의 크기에 상관없이 더 큰 크기의 리스트를 만들수 있음
front=0
mid=1
back=2
lst2=[]
while(back<=n-1):
while(mid<=back-1):
while(front<=mid-1):
lst2.append(lst[front]+lst[mid]+lst[back])
front=front+1
front=0
mid=mid+1
mid=1
back=back+1
lst2.sort()
maxValue=lst2[0]
for i in range(1,len(lst2)):
if lst2[i]>m: break
if lst2[i]>maxValue:
maxValue=lst2[i]
print(maxValue)
#백준2798번 다른풀이
n,m=map(int,input().split())
lst=list(map(int,input().strip().split()))[:n]#입력받은 n의 크기 만큼만 리스트를 만듬
#--------------------이 밑으로는 위와 동일한 코드
front=0
mid=1
back=2
lst2=[]
while(back<=n-1):
while(mid<=back-1):
while(front<=mid-1):
lst2.append(lst[front]+lst[mid]+lst[back])
front=front+1
front=0
mid=mid+1
mid=1
back=back+1
lst2.sort()
maxValue=lst2[0]
for i in range(1,len(lst2)):
if lst2[i]>m: break
if lst2[i]>maxValue:
maxValue=lst2[i]
print(maxValue)
#백준2798번 다른풀이2(다른사람풀이)
def P(n,m,c):
t=set()
for i in range(n-2):
for o in range(i+1,n-1):
for p in range(o+1,n):
s=c[i]+c[o]+c[p]
if s<=m:
t.add(s)
break
return max([*t])
print(P(*map(int,input().split()),list(sorted(map(int,input().split()))[::-1])))