void main(){
	long n, m, k;
	readf("%d %d %d\n", &n, &m, &k);
	// 読み込み
	long[] in_a = _scanln!long();
	long[] in_b = _scanln!long();
	// 配列をそれまでの累積値として再計算
	long[] a = [0];
	long[] b = [0];
	foreach(i; 0..n) a ~= a[i] + in_a[i];
	foreach(i; 0..m) b ~= b[i] + in_b[i];

	// aから徐々に選択していく
	long ans;
	long j = m; // aが選択されるごとに選択できるbの個数jは減る
	foreach(i, alm; a){
		if(alm > k)break; // 時間超過
		// bの選択
		while(b[j] > k-a[i])j--;
		ans = max(ans, i+j); 
	}
	ans.writeln();
}

import std.stdio, std.conv, std.algorithm, std.numeric, std.string, std.math, std.range, std.container;

// 1要素のみの入力
T _scan(T= int)(){
	return to!(T)( readln().chomp() );
}

// 1行に同一型の複数入力
T[] _scanln(T = int)(){
	T[] ln;
	foreach(string elm; readln().chomp().split()){
		ln ~= elm.to!T();
	}
	return ln;
}
