package main
import (
"bufio"
"fmt"
"os"
"sort"
"strconv"
)
type Cup struct {
c int64
w int64
}
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Split(bufio.ScanWords)
buf := make([]byte, 1024*1024)
scanner.Buffer(buf, 1024*1024)
readInt := func() int {
scanner.Scan()
res, _ := strconv.Atoi(scanner.Text())
return res
}
readInt64 := func() int64 {
scanner.Scan()
res, _ := strconv.ParseInt(scanner.Text(), 10, 64)
return res
}
n := readInt()
m := readInt()
d := readInt64()
pCups := make([]Cup, n)
for i := 0; i < n; i++ {
pCups[i] = Cup{c: readInt64(), w: readInt64()}
}
iCups := make([]Cup, m)
for i := 0; i < m; i++ {
iCups[i] = Cup{c: readInt64(), w: readInt64()}
}
sort.Slice(pCups, func(i, j int) bool {
if pCups[i].c != pCups[j].c {
return pCups[i].c > pCups[j].c
}
return pCups[i].w < pCups[j].w
})
sort.Slice(iCups, func(i, j int) bool {
if iCups[i].c != iCups[j].c {
return iCups[i].c > iCups[j].c
}
return iCups[i].w < iCups[j].w
})
wP := make([]int64, n+1)
cP := make([]int64, n+1)
for i := 1; i <= n; i++ {
wP[i] = wP[i-1] + pCups[i-1].w
cP[i] = cP[i-1] + pCups[i-1].c
}
wI := make([]int64, m+1)
cI := make([]int64, m+1)
for i := 1; i <= m; i++ {
wI[i] = wI[i-1] + iCups[i-1].w
cI[i] = cI[i-1] + iCups[i-1].c
}
var ans int64 = 0
j := m
for i := 1; i <= n; i++ {
for j >= 1 && wP[i]+wI[j] > d {
j--
}
if j >= 1 {
if cP[i]+cI[j] > ans {
ans = cP[i] + cI[j]
}
}
}
fmt.Println(ans)
}