# Aそれぞれに対してBを二分探索→M(累積和構成) + NlogM

# Aを昇順、Bを降順に動かす→O(N+M)

import bisect



n, m, k = list(map(int, input().split()))

aa = list(map(int, input().split()))

bb = list(map(int, input().split()))



# 累積和を作る

b_cumsum = [0] * (m+1)

for i in range(m):

    b_cumsum[i+1] = b_cumsum[i] + bb[i]



ans = 0

a_sum = 0

b_rest = k



temp = bisect.bisect(b_cumsum, b_rest) - 1

ans = max(ans, temp)



for idx, a in enumerate(aa):

    a_sum += a

    b_rest -= a

    if a_sum > k:

        break

    temp = idx + 1 + bisect.bisect(b_cumsum, b_rest) - 1

    ans = max(ans, temp)



print(ans)

# 二通りのやり方で解いてみよう。

# Aそれぞれに対してBを二分探索→M(累積和構成) + NlogM

# Aを昇順、Bを降順に動かす→O(N+M) このコードはこっち★



n, m, k = list(map(int, input().split()))

aa = list(map(int, input().split()))

bb = list(map(int, input().split()))



time_sum = sum(bb)



a_idx = 0

b_idx = m-1

ans = 0



# 最初はA無し、B全部からスタート

book_num = m

while True:

    if time_sum > k:



        if b_idx < 0:

            break

        time_sum -= bb[b_idx]

        b_idx -= 1

        book_num -= 1

    else:

        # 実行可能な読み方

        ans = max(ans, book_num)

        

        if a_idx > n-1:

            break

        time_sum += aa[a_idx]

        a_idx += 1

        book_num += 1



print(ans)

# Aそれぞれに対してBを二分探索→M(累積和構成) + NlogM
# Aを昇順、Bを降順に動かす→O(N+M)
import bisect

n, m, k = list(map(int, input().split()))
aa = list(map(int, input().split()))
bb = list(map(int, input().split()))
# 累積和を作る
b_cumsum = [0] * (m + 1)
for i in range(m):
    b_cumsum[i + 1] = b_cumsum[i] + bb[i]
ans = 0
a_sum = 0
b_rest = k
temp = bisect.bisect(b_cumsum, b_rest) - 1
ans = max(ans, temp)
for idx, a in enumerate(aa):
    a_sum += a
    b_rest -= a
    if a_sum > k:
        break
    temp = idx + 1 + bisect.bisect(b_cumsum, b_rest) - 1
    ans = max(ans, temp)
print(ans)

# 二通りのやり方で解いてみよう。
# Aそれぞれに対してBを二分探索→M(累積和構成) + NlogM
# Aを昇順、Bを降順に動かす→O(N+M) このコードはこっち★
n, m, k = list(map(int, input().split()))
aa = list(map(int, input().split()))
bb = list(map(int, input().split()))
time_sum = sum(bb)
a_idx = 0
b_idx = m - 1
ans = 0
# 最初はA無し、B全部からスタート
book_num = m
while True:
    if time_sum > k:
        if b_idx < 0:
            break
        time_sum -= bb[b_idx]
        b_idx -= 1
        book_num -= 1
    else:
        # 実行可能な読み方
        ans = max(ans, book_num)
        if a_idx > n - 1:
            break
        time_sum += aa[a_idx]
        a_idx += 1
        book_num += 1
print(ans)

+# 二通りのやり方で解いてみよう。 -# Aを昇順、Bを降順に動かす→O(N+M) -import bisect - +# Aを昇順、Bを降順に動かす→O(N+M) このコードはこっち★ -# 累積和を作る -b_cumsum = [0] * (m + 1) -for i in range(m): -    b_cumsum[i + 1] = b_cumsum[i] + bb[i] +time_sum = sum(bb) +a_idx = 0 +b_idx = m - 1 -a_sum = 0 -b_rest = k -temp = bisect.bisect(b_cumsum, b_rest) - 1 -ans = max(ans, temp) -for idx, a in enumerate(aa): -    a_sum += a -    b_rest -= a -    if a_sum > k: -        break -    temp = idx + 1 + bisect.bisect(b_cumsum, b_rest) - 1 -    ans = max(ans, temp) +# 最初はA無し、B全部からスタート +book_num = m +while True: +    if time_sum > k: +        if b_idx < 0: +            break +        time_sum -= bb[b_idx] +        b_idx -= 1 +        book_num -= 1 +    else: +        # 実行可能な読み方 +        ans = max(ans, book_num) +        if a_idx > n - 1: +            break +        time_sum += aa[a_idx] +        a_idx += 1 +        book_num += 1