N,T=list(map(int,input().split()))

x=[None] # x[0]

for i in range(1,N+1): # x[i]のiに対応させる

    x.append(tuple(map(int,input().split()))) # x[1]~x[N]

# print(x) #DB★



dp1=[[0 for j in range(T)] for i in range(N+2)] # 0~N+1 dp1[i]はx[1]からx[i]まで使用（dp1[0]は使用するx[i]なしの初期値，dp1[N+1]は余り→0で初期化していることが後で役に立つ）

for i in range(1,N+1): # dp1[0]は初期値なのでいじらない。dp1[N+1]は余りなので計算しない。dp1[N]まで計算するので，iはNまで

    for j in range(T): # 0分後からT-1分後まで計算する

        if x[i][0]>j:

            dp1[i][j]=dp1[i-1][j]

        else:

            dp1[i][j]=max(dp1[i-1][j],dp1[i-1][j-x[i][0]]+x[i][1])



# print(dp1) #DB★



dp2=[[0 for j in range(T)] for i in range(N+2)] # 0~N+1 dp2[i]はx[i]からx[N]まで（x[N]からx[i]まで）使用（dp2[N+1]は使用するx[i]なしの初期値，dp2[0]は余り）

for i in range(N,0,-1): # dp2[N+1]は初期値なのでいじらない。dp2[0]は余りなので計算しない。dp2[1]まで計算するので，iは1まで

    for j in range(T):

        if x[i][0]>j:

            dp2[i][j]=dp2[i+1][j]

        else:

            dp2[i][j]=max(dp2[i+1][j],dp2[i+1][j-x[i][0]]+x[i][1])



# print(dp2) #DB★



cans=[0 for i in range(N+1)] # i番目の料理を最後に食べる場合の満足度の最大値

for i in range(1,N+1):

    cans[i]=max([dp1[i-1][j]+dp2[i+1][T-1-j] for j in range(T)])+x[i][1]



# print(cans) #DB★ 



ans=max(cans)



print(ans)
N,T=list(map(int,input().split()))

x=[(0,0)] # x[0]

for i in range(1,N+1): # x[i]のiに対応させる

    x.append(tuple(map(int,input().split()))) # x[1]~x[N]



x.sort()

# print(x) #DB★



dp1=[[0 for j in range(T)] for i in range(N+2)] # 0~N+1 dp1[i]はx[1]からx[i]まで使用（dp1[0]は使用するx[i]なしの初期値，dp1[N+1]は余り→0で初期化していることが後で役に立つ）

for i in range(1,N+1): # dp1[0]は初期値なのでいじらない。dp1[N+1]は余りなので計算しない。dp1[N]まで計算するので，iはNまで

    for j in range(T): # 0分後からT-1分後まで計算する

        if x[i][0]>j:

            dp1[i][j]=dp1[i-1][j]

        else:

            dp1[i][j]=max(dp1[i-1][j],dp1[i-1][j-x[i][0]]+x[i][1])



cans=[dp1[i-1][T-1]+x[i][1] for i in range(1,N+1)]



# print(cans) #DB★ 



ans=max(cans)



print(ans)
N, T = list(map(int, input().split()))
x = [None]  # x[0]
for i in range(1, N + 1):  # x[i]のiに対応させる
    x.append(tuple(map(int, input().split())))  # x[1]~x[N]
# print(x) #DB★
dp1 = [
    [0 for j in range(T)] for i in range(N + 2)
]  # 0~N+1 dp1[i]はx[1]からx[i]まで使用（dp1[0]は使用するx[i]なしの初期値，dp1[N+1]は余り→0で初期化していることが後で役に立つ）
for i in range(1, N + 1):  # dp1[0]は初期値なのでいじらない。dp1[N+1]は余りなので計算しない。dp1[N]まで計算するので，iはNまで
    for j in range(T):  # 0分後からT-1分後まで計算する
        if x[i][0] > j:
            dp1[i][j] = dp1[i - 1][j]
        else:
            dp1[i][j] = max(dp1[i - 1][j], dp1[i - 1][j - x[i][0]] + x[i][1])
# print(dp1) #DB★
dp2 = [
    [0 for j in range(T)] for i in range(N + 2)
]  # 0~N+1 dp2[i]はx[i]からx[N]まで（x[N]からx[i]まで）使用（dp2[N+1]は使用するx[i]なしの初期値，dp2[0]は余り）
for i in range(N, 0, -1):  # dp2[N+1]は初期値なのでいじらない。dp2[0]は余りなので計算しない。dp2[1]まで計算するので，iは1まで
    for j in range(T):
        if x[i][0] > j:
            dp2[i][j] = dp2[i + 1][j]
        else:
            dp2[i][j] = max(dp2[i + 1][j], dp2[i + 1][j - x[i][0]] + x[i][1])
# print(dp2) #DB★
cans = [0 for i in range(N + 1)]  # i番目の料理を最後に食べる場合の満足度の最大値
for i in range(1, N + 1):
    cans[i] = max([dp1[i - 1][j] + dp2[i + 1][T - 1 - j] for j in range(T)]) + x[i][1]
# print(cans) #DB★
ans = max(cans)
print(ans)

N, T = list(map(int, input().split()))
x = [(0, 0)]  # x[0]
for i in range(1, N + 1):  # x[i]のiに対応させる
    x.append(tuple(map(int, input().split())))  # x[1]~x[N]
x.sort()
# print(x) #DB★
dp1 = [
    [0 for j in range(T)] for i in range(N + 2)
]  # 0~N+1 dp1[i]はx[1]からx[i]まで使用（dp1[0]は使用するx[i]なしの初期値，dp1[N+1]は余り→0で初期化していることが後で役に立つ）
for i in range(1, N + 1):  # dp1[0]は初期値なのでいじらない。dp1[N+1]は余りなので計算しない。dp1[N]まで計算するので，iはNまで
    for j in range(T):  # 0分後からT-1分後まで計算する
        if x[i][0] > j:
            dp1[i][j] = dp1[i - 1][j]
        else:
            dp1[i][j] = max(dp1[i - 1][j], dp1[i - 1][j - x[i][0]] + x[i][1])
cans = [dp1[i - 1][T - 1] + x[i][1] for i in range(1, N + 1)]
# print(cans) #DB★
ans = max(cans)
print(ans)

-x = [None]  # x[0] +x = [(0, 0)]  # x[0] +x.sort() -# print(dp1) #DB★ -dp2 = [ -    [0 for j in range(T)] for i in range(N + 2) -]  # 0~N+1 dp2[i]はx[i]からx[N]まで（x[N]からx[i]まで）使用（dp2[N+1]は使用するx[i]なしの初期値，dp2[0]は余り） -for i in range(N, 0, -1):  # dp2[N+1]は初期値なのでいじらない。dp2[0]は余りなので計算しない。dp2[1]まで計算するので，iは1まで -    for j in range(T): -        if x[i][0] > j: -            dp2[i][j] = dp2[i + 1][j] -        else: -            dp2[i][j] = max(dp2[i + 1][j], dp2[i + 1][j - x[i][0]] + x[i][1]) -# print(dp2) #DB★ -cans = [0 for i in range(N + 1)]  # i番目の料理を最後に食べる場合の満足度の最大値 -for i in range(1, N + 1): -    cans[i] = max([dp1[i - 1][j] + dp2[i + 1][T - 1 - j] for j in range(T)]) + x[i][1] +cans = [dp1[i - 1][T - 1] + x[i][1] for i in range(1, N + 1)]