#include <bits/stdc++.h>

using namespace std;

#define TEMP_T template<typename T>
TEMP_T void sort(T& v){ sort(v.begin(), v.end()); }
TEMP_T void revs(T& v){ reverse(v.begin(), v.end()); }
TEMP_T void uniq(T& v){ sort(v); v.erase(unique(v.begin(), v.end())); }
TEMP_T void show(T& v, char delim=' ', char end='\n'){ for(int i=0; i<v.size()-1; i++) cout << v[i] << delim; cout << v[v.size()-1] << end; }
TEMP_T T    cums(T& v){ T r; r.push_back(v[0]); for(int i=1; i<v.size(); i++) r.push_back(r[i-1] + v[i]); return r; }
TEMP_T void maxe(T& v, T m){ v = max(v, m); }
TEMP_T void mine(T& v, T m){ v = min(v, m); }

static inline int in(){ int x; scanf("%d", &x); return x; }

int main()
{
  int n, m;
  while (n = in(), m = in()){
    vector<int> p;
    for (int i = 0; i < n; i++){
      p.push_back(in());
    }
    p.push_back(0);
    n++;

    vector<int> pp;
    for (int i = 0; i < n; i++){
      for (int j = 0; j < n; j++){
        pp.push_back(p[i] + p[j]);
      }
    }
    int maxi = 0;
    sort(pp);
    for (int i = 0; i < n; i++){
      for (int j = 0; j < n; j++){
        int s = p[i] + p[j];
        int v = *(upper_bound(pp.begin(), pp.end(), m - s) - 1);
        if (s + v <= m){
          maxe(maxi, s + v);
        }
      }
    }
    printf("%d\n", maxi);
  }

  return 0;
}
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <utility>
#include <stack>
#include <queue>
#include <set>
#include <list>
#include <bitset>
#include <array>

using namespace std;

#define fi first	
#define se second
#define long long long
typedef pair<int,int> ii;

vector<long> vec;
bool prime(int x)
{
	for(int i = 2; i <= sqrt(x); i++)
	{
		if(x%i == 0)
			return 0;
	}
	return 1;
}
long MAXN = 500;
long A[503][503];
long gcd(long a, long b) {return (b)? gcd(b,a%b) : a;}
long lcm(long a, long b) 
{
	if(a == b && b == 0) return 0;
	else if(a == 0) return b;
	else if(b == 0) return a;
	else return a/gcd(a,b)*b;
}

int main()
{
	// ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	// freopen("input.in", "r", stdin);

	for(int i = 2; i <= 10000; i++)
		if(prime(i))
			vec.push_back(i);

	int n; scanf("%d", &n);

	int idx = 0;
	for(int i = 1; i <= MAXN; i+=2)
	{
		int x = 1, y = i;
		while(y <= MAXN)
			A[x++][y++] = vec[idx];
		idx++;
	}
	for(int i = 3; i <= MAXN; i+=2)
	{
		int x = i, y = 1;
		while(x <= MAXN)
			A[x++][y++] = vec[idx];
		idx++;
	}
	for(int i = 1; i <= MAXN; i+=2)
	{
		int x = 1, y = i;
		while(y >= 1 && x <= MAXN)
			A[x++][y--] *= vec[idx];
		idx++;
	}
	for(int i = MAXN; i >= 2; i-=2)
	{
		int x = i, y = MAXN;
		while(y >= 1 && x <= MAXN)
			A[x++][y--] *= vec[idx];
		idx++;
	}

	long mx = 0;

	for(int i = 1; i <= n; i++)
	{
		for(int j = 1; j <= n; j++)
		{
			if(A[i][j] == 0) A[i][j] = lcm(lcm(A[i-1][j],A[i][j-1]),lcm(A[i+1][j],A[i][j+1]))+1;
			// mxnax(A[i][j],mx);
			printf("%lld", A[i][j]);
			if(j < n) printf(" ");
		}
		printf("\n");
	}
	// printf("%lld\n", mx);
}









