// Slower C++ solution:
/**

 *  Author : Coda

 *  Title : OSU!

 *  Date : 2019-08-20

 */

#include <bits/stdc++.h>

using namespace std ;



typedef long long ll ;

typedef unsigned long long ull ;

typedef double DB ;

const long long mod = 1e9+7 ;

const double pi = acos(-1) ;

#define PB push_back

#define MP make_pair

#define lb lower_bound

#define ub upper_bound

#define fs first

#define sd second

#define pii pair<int,int>

#define INF 0x3f3f3f3f

#define LLINF 0x3f3f3f3f3f3f3f3f

#define debug(x) cout << #x << " = " << x << endl

#define debug2(x,y) cout << #x << " = " << x << ' ' << #y << " = " << y << endl

#define debug3(x,y,z) cout << #x << " = " << x << ' ' << #y << " = " << y << ' ' << #z << " = " << z << endl

//#pragma comment(linker,"/STACK:10240000,10240000")

//#include <random>

//mt19937 rand_(time(0));

ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}

ll qpow(ll a,ll b,ll c){ll t=1;while(b){if(b&1)t=t*a%c;a=a*a%c;b>>=1;}return t;}

ll inv(ll x){return qpow(x,mod-2,mod);}

int test = 1 ;



const int maxn = 5 + 3e5 ;

const int maxm = 5 + 1e6 ;

// Write the variables here



int N,W ;

ll v[maxn],w[maxn] ;

ll dp[maxn] ;



//#define TEST

int main(){

#ifdef TEST

    freopen("in.txt","r",stdin) ;

#endif

    while(test--){

        // code begins

        scanf("%d%d",&N,&W) ;



        ll sum = 0 ;

        for(int i=1 ; i<=N ; i++){

            scanf("%lld%lld",&w[i],&v[i]) ;

        }

        for(int i=1 ; i<=100000 ; i++){

            dp[i] = LLINF ;

        }

        dp[0] = 0;

        ll ans = 0 ;

        for(int i=1 ; i<=N ; i++){

            for(int j=100000 ; j>=v[i] ; j--){

                dp[j] = min(dp[j],dp[j-v[i]]+w[i]);

            }

        }

        for(int i=1 ; i<=100000 ; i++){

            if(dp[i]<=W) ans = max(ans,i*1ll) ;

        }

        printf("%lld\n",ans) ;



    }

#ifdef TEST

    cout << "time: " << (long long)clock() * 1000 / CLOCKS_PER_SEC << " ms" << endl;

#endif

    return 0 ;

}


// Faster C++ solution for the same problem (measured speedup: 2.516598010218516x):
// Author : ZERO_IQ

// Practice is the only shortcut to improve



#pragma GCC optimize ("O3")

#pragma GCC optimize ("unroll-loops")



#include <bits/stdc++.h>



using namespace std;

using ll = long long;



#define debug(x, y) cerr << (#x) << " " << (#y) <<" is " << (x) <<" "<< (y) << endl

#define debug2(x, y, z) cerr << (#x) << " " <<(#y) << " " << (#z) << " is " << (x) << " " << (y) << " " << (z) << endl

#define endl '\n'



ll const N = 1e7 + 1;



int main() {

    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    /*#ifndef ONLINE_JUDGE

        freopen("input.txt", "r", stdin);

        freopen("output.txt", "w", stdout);

    #endif*/

    long long n, m;

    cin >> n >> m;

    vector<pair<long long, long long >> input;

    long long summ = 0;

    for (int i = 0; i < n; ++i) {

        long long q, qq;

        cin >> q >> qq;

        input.push_back({q, qq});

        summ += qq;

    }

    vector<vector<long long>> dp(n, vector<long long>(summ + 2, 1e18));

    for (int var = 0; var < n; ++var) {

        dp[var][0] = 0;

    }

    ll maxx = 0;

    for (int i = 1; i <= summ; ++i) {

        for (int j = 0; j < n; ++j) {

            if (!j) {

                if (i == input[j].second)

                    dp[j][i] = input[j].first;

            } else if (input[j].second > i) {

                dp[j][i] = dp[j - 1][i];

            } else {

                dp[j][i] = min(dp[j - 1][i], dp[j - 1][i - input[j].second]

                               + input[j].first);

            }

        }

    }

    for (int i = 0; i <= summ; i++) {

        if (dp[n - 1][i] <= m) {

            maxx = i;

        }

    }

    cout << maxx << endl;

    return 0;

}