#include<bits/stdc++.h>
#define int long long
using namespace std;
const int length=1048577;
int n1[length],n2[length];
void cal(int n,const int a[],int l[],int c)
{
	for(int i=0;i<(1<<n);i++)
	{
		int s=0;
		for(int j=0;j<n;j++)
		{
			if(i&(1<<j))
			{
				s+=a[j+c];	
			}	
			
		}
		l[i]=s;
	}
	return ;
}
signed main()
{
	int n,t;
	while(cin>>n>>t)
	{
		int a[n];
		for(int i=0;i<n;i++) cin>>a[i];
		cal(n/2,a,n1,0);
		cal(n-n/2,a,n2,n/2);
		int l1=n/2;
		l1=1<<l1;
		int l2=n-n/2;
		l2=(1<<l2);
		sort(n1,n1+l1);
		//cout<<l1<<" "<<l2<<"\n";
		//for(int i=0;i<l1;i++) cout<<n1[i]<<" ";cout<<"\n";
		//for(int i=0;i<l2;i++) cout<<n2[i]<<" ";cout<<"\n";
		int ans=0;
		for(int i=0;i<l2;i++)
		{
			if(n2[i]>t) continue;
			else if(n2[i]==t){ans=t;break;
			}
			else
			{
				int p=upper_bound(n1,n1+l1,t-n2[i])-n1-1;
				if(p<0) 
				{
					ans=max(ans,n2[i]);
				}
				else ans=max(ans,n2[i]+n1[p]);
			}
		}
		cout<<ans<<"\n";
	}
} 
/*
6 6
1 2 3 7 8 9
*/ 
/*
1->1
2->10
3->101
4->100
8->1000
2^n->1,n個0 
*/
#include <bits/stdc++.h>
/* #include <atcoder/all> */

#define rng(i, a, b) for (int i = int(a); i < int(b); i++)
#define rep(i, b) rng(i, 0, b)
#define gnr(i, a, b) for (int i = int(b) - 1; i >= int(a); i--)
#define per(i, b) gnr(i, 0, b)

using namespace std;
/* using namespace atcoder; */

using ll = long long;
using P = pair<int, int>;

int main() {
  int n, t;
  cin >> n >> t;
  vector<int> a(n);
  rep(i, n) cin >> a.at(i);
  // 半分全列挙
  // 半分ずつの解くのにかかる時間の総和を x1, x2 とする
  vector<ll> x1, x2;
  x1 = x2 = {0};
  rep(i, n) {
    for (int j = (int) x1.size() - 1; j >= 0; j--) {
      x1.push_back(x1.at(j) + a.at(i));
    }
    swap(x1, x2);
  }
  // 二分探索のために昇順にソート
  sort(x1.begin(), x1.end());
  // x2 の各要素に対して、x1 を二分探索
  ll res = 0;
  rep(i, x2.size()) {
    ll cur = x2.at(i);
    if (cur > t) continue;
    // t - cur より大きい最初の値のインデックス
    // 0 を値に持つのでインデックスの最小値は 1
    int ui = upper_bound(x1.begin(), x1.end(), t - cur) - x1.begin();
    res = max(res, cur + x1.at(ui - 1));
  }
  cout << res << endl;
  return 0;
}
