//void _(){
//    int n,x;
//    cin >> n >> x;
//    vi arr(n);
//    cin >> arr;
//    sort(all(arr));
//    int ans = 0;
//    for(int i = 0; i < n; ++i){
//        if(i == n-1){
//            if(x == arr[i])
//                ++ans;
//        }
//        else{
//            if(x >= arr[i]){
//                x -= arr[i];
//                ++ans;
//            }
//        }
//
//    }
//    print(ans);
//}
//
//
// ================================================ 
// ^^^	ABOVE is what I wrote in my editor	^^^
// ------------------------------------------------ 
// vvv	BELOW is automatically generated 	vvv
// ================================================ 
#include <set>
#include <iomanip>
#include <algorithm> 
#include <cassert>
#include <vector>
#include <iostream>
#define all(v) (v).begin(),(v).end()
using namespace std;
typedef long long ll;
typedef vector<int> vi;
template<typename IT>
ostream &print(IT b, IT e, string sep = " ", ostream &stream = cout){
	for(IT it = b; it != e; ++it){
		stream << *it;
		if(it+1 != e) stream << sep;
	} 
	return stream;
}
template<typename IT> istream &read(IT b, IT e, istream &stream = cin){
	for(IT it = b; it != e; ++it) stream >> *it; return stream;
}
template<typename T> ostream &operator<<(ostream &stream, vector<T> &t){
	return print(all(t)," ",stream);
}
template<typename T> ostream &operator<<(ostream &stream, vector<T> &&t){
	return print(all(t)," ",stream);
}
template<typename T> istream &operator>>(istream &stream, vector<T> &t){
	return read(all(t),stream);
}
template <typename T> 
void print(T x){
	cout << x << '\n';
}
template <typename t> 
void print(vector<t> arr,string sep=" "){
    if(arr.empty())
        return;
	print(arr.begin(),arr.end(),sep);
	cout << '\n';
}
template <typename T> 
void print(vector<vector<T> > arr){
	for(int i = 0; i < arr.size(); ++i){
		cout << "[" << arr[i] << "]";
		if(i+1 < arr.size())
			cout << ", ";
	}
	cout << '\n';
}
template<typename T>
T _();
const ll INF = ll(2e18)+666;
const ll MOD = 1e9+7;
template<typename T>
vector<T> operator+(const vector<T> &lhs, const vector<T> &rhs){
	vector<T> ans(lhs);
	assert(ans.size() == rhs.size());
	for(int i = 0; i < rhs.size(); ++i)
		ans[i] += rhs[i];
	return ans;
}
template<typename T>
vector<T> operator+=(vector<T> &lhs, const vector<T> &rhs){
	return lhs = lhs+rhs;
	//vector<T> ans(lhs);
	//assert(ans.size() == rhs.size());
	//for(int i = 0; i < rhs.size(); ++i)
		//ans[i] += rhs[i];
	//return ans;
}
template<typename T>
vector<T> operator-(const vector<T> &lhs, const vector<T> &rhs){
	vector<T> ans(all(lhs));
	assert(ans.size() == rhs.size());
	for(int i = 0; i < rhs.size(); ++i)
		ans[i] -= rhs[i];
	return ans;
}
template<typename T>
vector<T> operator-=(vector<T> &lhs, const vector<T> &rhs){
	return lhs = lhs-rhs;
	//vector<T> ans(lhs);
	//assert(ans.size() == rhs.size());
	//for(int i = 0; i < rhs.size(); ++i)
		//ans[i] += rhs[i];
	//return ans;
}
template<typename T>
T max(const vector<T> arr){
	assert(!arr.empty());
	T ans = arr[0];
	for(auto &cur : arr)
		ans = max(ans,cur);
	return ans;
}
template<typename T>
T max(const set<T> s){
	assert(!s.empty());
	return *--s.end();
}
template<typename T, typename G>
vector<T> set_max(vector<T> &base, const vector<G> &comp){
	assert(base.size() == comp.size());
	for(int i = 0; i < (int)comp.size(); ++i)
		base[i] = max(base[i],comp[i]);
	return base;
}
void _(){
    int n,x;
    cin >> n >> x;
    vi arr(n);
    cin >> arr;
    sort(all(arr));
    int ans = 0;
    for(int i = 0; i < n; ++i){
        if(i == n-1){
            if(x == arr[i])
                ++ans;
        }
        else{
            if(x >= arr[i]){
                x -= arr[i];
                ++ans;
            }
        }

    }
    print(ans);
}

int main(){
	ios_base::sync_with_stdio(false); cin.tie(0);
	cout << fixed << setprecision(12);
	_();
}


Measured memory_bytes: 256