def get_i() #空白区切の入力を数値(整数)の配列で返す
  return gets.chomp.split(" ").map(&:to_i)
end
def get_f() #空白区切の入力を数値(実数)の配列で返す
  return gets.chomp.split(" ").map(&:to_f)
end
def get() #空白区切の入力を文字列の配列で返す
  return gets.chomp.split(" ")
end
def get_nsp() #入力されたものを一文字ずつに区切った文字列の配列で返す
  return gets.chomp.split("")
end
def yn_judge(bool,y="Yes",n="No") #boolに真偽を投げることで、trueならy、falseならnの値を出力する
  return bool ? y : n 
end
def array(size,n=1,init=nil) #nに配列の次元数、sizeに配列の大きさ、initに初期値を投げることでその配列を返す
  if n==1
    return Array.new(size){init}
  else
    return Array.new(n).map{Array.new(size){init}}
  end
end

def max(a,b)
  return a>b ? a : b
end

def min(a,b)
  return a>b ? b : a
end
N,W=get_i
wv=array(N,1)
N.times do|i|
  wv[i]=get_i
end
wv.sort!{|x,y| x[1]<=>y[1]}
MAX_V=10**3*N
INF=Float::INFINITY
dp=array(MAX_V+1,N+1,INF)
dp[0][0]=0
N.times do|i|
  w,v=wv[i]
  0.upto(MAX_V) do|j|
    dp[i+1][j]=dp[i][j]
    dp[i+1][j]=min(dp[i][j-v]+w,dp[i+1][j]) if j-v>=0
  end 
end
max=0
MAX_V.times do|i|
  max=i+1 if dp[N][i+1]<=W
end
puts max