//Nihal Mittal - nihal_47
//Strike First , Strike Hard , No Mercy !!

/**⠀⠀⠀⠀⠀⠀⣀⣤⣤⣄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⣀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⣰⣿⣿⣿⣿⠿⠿⣿⣿⣿⣿⣿⣿⣿⣧⢀⠀⠀⠀⠀
⠀⠀⠀⣿⣿⣿⠋⠀⠀⠀⠀⠀⠙⠀⠙⣿⣿⣿⣷⢳⢀⠀⠀⠀
⠀⠀⣠⣿⣿⣿⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⢀
⠀⠀⣸⣿⣿⣿⠸⠀⠀⠀⠒⠒⠒⠐⠀⠀⢿⣿⣿⣿⣿⣿⠀⠀
⠀⣴⣿⣿⣿⡿⠀⠒⣋⣙⡒⢰⠀⠤⣖⠒⢾⣿⣿⣿⣿⣧⠀⠀
⢺⣿⣿⣿⣿⢀⠀⠀⠉⠉⠉⠸⠀⡇⠉⠉⠀⢿⣿⣿⣿⣄⠀⠀
⠀⠙⣿⣿⣧⢻⠀⠀⠀⠀⠀⠠⠀⠰⠀⠀⠀⣸⠸⣿⣿⠿⠰⠀
⠀⠀⠀⠹⣿⣿⣿⣷⠀⡠⠙⣲⣔⣅⢡⣰⣷⣿⣿⣿⣧⠀⠀⠀
⠀⠀⠀⣼⣿⣿⣿⣿⠀⡿⠭⠭⠭⠭⢿⠀⣿⢻⣿⣿⠃⠀⠀⠀
⠀⠀⠀⠙⠛⣿⢻⠹⣿⠐⠙⠛⠟⠉⢀⣴⡟⢿⣿⡏⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⡟⠀⠀⠻⣦⣤⣶⠾⠋⠀⠀⠁⡦⢄⢀⠀⠀⠀
⠀⠀⠀⠀⡠⠁⡇⠑⢄⠀⠀⠀⠀⠀⠀⠔⠀⠀⠁⠀⠀⠀⠉⠁
⠀⠔⠊⠁⠀⠀⣇⠀⠀⠀⠑⡤⠤⢎⠁⠀⠀⡘⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⢢⠠⠀⡠⢆⠀⠀⡠⠙⢄⠀⡸⠀
**/
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define ll long long
#define ld long double
#define mk make_pair
#define pb push_back
#define in insert
#define se second
#define fi first
#define mod 1000000007
#define watch(x) cout << (#x) << " is " << (x) << "\n"
#define all(v) (v).begin(),(v).end()
#define fast ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(0);
#define printclock cerr<<"Time : "<<1000*(ld)clock()/(ld)CLOCKS_PER_SEC<<"ms\n";
#define pii pair<ll,ll>
#define vi(x) vector<x>
#define maxn 100005
#define ordered_set tree<ll, null_type,less<ll>, rb_tree_tag,tree_order_statistics_node_update> 
using namespace std;
using namespace __gnu_pbds;
vector<ll> x[3];
ll n,t;
ll a[50];
void solve(ll i,ll so,ll cn, ll et)
{
	if(i==et){
        x[cn].pb(so);
        return;
	}
	solve(i+1,so,cn,et);
	solve(i+1,so+a[i],cn,et);
}
signed main()
{
    fast;
  
    ll i,j,ans=0;
    cin>>n>>t;
    for(i=0;i<n;i++)
    {
    	cin>>a[i];
    }
    solve(0,0,0,n/2);

    solve(n/2,0,1,n);
    sort(all(x[0]));
    for(auto u: x[1]){
    	if(u>t) continue;
    	auto it = upper_bound(x[0].begin(),x[0].end(),t-u);
    	ll ha = u;
    	if(it!=x[0].begin()) {
    		it--;
            ha += *it;
    	}
    	ans = max(ans,ha);
    }
    cout<<ans;



  



}
#include <bits/stdc++.h>
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
#define fi first
#define se second
#define pb push_back
#define pii pair<int,int>
#define endl "\n"
#define scd(a) scanf("%d",&a)
#define scdd(a,b) scanf("%d%d",&a,&b)
#define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
const ll INF = (ll)0x3f3f3f3f3f3f3f, MAX = 9e18, MIN = -9e18;
const double PI=acos(-1.0);
const double eps=1e-6;
const ll mod=1e9+7;
const int inf=0x3f3f3f3f;
const int maxn=1e2+10;
const int maxm=100+10;
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define lowbit(x) (x&(-x))
using namespace std;
ll n,m,k;
ll a[maxn];
ll dp[maxn];
int vis[maxn];
ll ans = 0;
ll sum[maxn];
int r;
void dfs(ll sum1,int r){
    if(sum1 > k)
       return ;
    ans = max(ans,sum1);
    if(sum[r] + sum1 <= k){
        ans = max(sum[r] + sum1,ans);
        return ;
    }
    if(ans == k){
        return ;
    }
    for(int i = 1; i<=r; i++){
        if(vis[i] == 1)
            continue;
        if(sum1 + a[i] > k){
            return ;
        }
        vis[i] = 1;
        dfs(sum1+a[i],i-1);
        vis[i] = 0;
    }
}
void run_case(){
    cin>>n>>k;
    ll sum1 = 0;
    for(int i = 1; i<=n; i++){
        cin>>a[i];
        sum1 += a[i];
    }
    if(sum1 <= k){
        cout<<sum1<<endl;
        return ;
    }
    sort(a+1,a+n+1);
    for(int i = 1; i<=n; i++)
        sum[i] = sum[i-1] + a[i];
    for(int i = n; i>=1; i--){
        vis[i] = 1;
        dfs(a[i],i-1);
        vis[i] = 0;
    }
    cout<<ans<<endl;
}


int main(){
    ios;
    run_case();
}
