#include using namespace std; using lint = long long; int main() { lint n, m, k; cin >> n >> m >> k; vector a(n); for (int i = 0; i < n; i++) cin >> a[i]; a.push_back(0); n++; vector vec3(n*n*n); vector vec2(n*n*n); int cnt = 0; int count = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { for (int k = 0; k < n; k++) { vec3[cnt] = a[i]+a[j]+a[k]; cnt++; } vec2[count] = a[i]+a[j]; count++; } } sort(vec3.begin(), vec3.end()); sort(vec2.begin(), vec2.end()); sort(a.begin(), a.end()); lint ans = -1; if (k == 1) { auto itr = upper_bound(a.begin(), a.end(), m); int idx = itr-a.begin()-1; ans = a[idx]; } else if (k == 2) { auto itr = upper_bound(vec2.begin(), vec2.end(), m); int idx = itr-vec2.begin()-1; ans = vec2[idx]; } else if (k == 3) { auto itr = upper_bound(vec3.begin(), vec3.end(), m); int idx = itr-vec3.begin()-1; ans = vec3[idx]; } else if (k == 4) { for (int i = 0; i < n*n*n; i++) { auto itr = upper_bound(a.begin(), a.end(), m-vec3[i]); if (itr == a.begin()) continue; else { int idx = itr-a.begin()-1; if (vec3[i]+a[idx] > m) continue; else ans = max(ans, vec3[i]+a[idx]); } } } else if (k == 5) { for (int i = 0; i < n*n*n; i++) { auto itr = upper_bound(vec2.begin(), vec2.end(), m-vec3[i]); if (itr == vec2.begin()) continue; else { int idx = itr-vec2.begin()-1; if (vec3[i]+vec2[idx] > m) continue; else ans = max(ans, vec3[i]+vec2[idx]); } } } else if (k == 6) { for (int i = 0; i < n*n*n; i++) { auto itr = upper_bound(vec3.begin(), vec3.end(), m-vec3[i]); if (itr == vec3.begin()) continue; else { int idx = itr-vec3.begin()-1; if (vec3[i]+vec3[idx] > m) continue; else ans = max(ans, vec3[i]+vec3[idx]); } } } cout << ans << endl; }