package main
import (
"bufio"
"io"
"os"
"sort"
)
const INF int64 = 1 << 60
type FastScanner struct {
data []byte
idx int
n int
}
func NewFastScanner() *FastScanner {
b, _ := io.ReadAll(os.Stdin)
return &FastScanner{data: b, n: len(b)}
}
func (fs *FastScanner) NextInt() int {
s := 1
v := 0
for fs.idx < fs.n {
c := fs.data[fs.idx]
if (c >= '0' && c <= '9') || c == '-' {
break
}
fs.idx++
}
if fs.idx < fs.n && fs.data[fs.idx] == '-' {
s = -1
fs.idx++
}
for fs.idx < fs.n {
c := fs.data[fs.idx]
if c < '0' || c > '9' {
break
}
v = v*10 + int(c-'0')
fs.idx++
}
return v * s
}
type Fenwick struct {
n int
bit []int
}
func NewFenwick(n int) *Fenwick {
return &Fenwick{n: n, bit: make([]int, n+2)}
}
func (f *Fenwick) Add(i, delta int) {
i++
for i <= f.n {
f.bit[i] += delta
i += i & -i
}
}
func (f *Fenwick) Sum(i int) int {
i++
s := 0
for i > 0 {
s += f.bit[i]
i -= i & -i
}
return s
}
func (f *Fenwick) Kth(k int) int {
idx := 0
bitMask := 1
for bitMask < f.n {
bitMask <<= 1
}
for step := bitMask; step != 0; step >>= 1 {
next := idx + step
if next <= f.n && f.bit[next] < k {
k -= f.bit[next]
idx = next
}
}
return idx
}
func lowerBound(a []int64, x int64) int {
l, r := 0, len(a)
for l < r {
m := (l + r) >> 1
if a[m] < x {
l = m + 1
} else {
r = m
}
}
return l
}
func computeNext(base []int64, prev []int64, banned [][]int) []int64 {
nPrev := len(prev)
nCurr := len(base)
vals := make([]int64, nPrev)
copy(vals, prev)
sort.Slice(vals, func(i, j int) bool { return vals[i] < vals[j] })
uniq := make([]int64, 0, len(vals))
for i, v := range vals {
if i == 0 || v != vals[i-1] {
uniq = append(uniq, v)
}
}
idxPrev := make([]int, nPrev)
for i := 0; i < nPrev; i++ {
idxPrev[i] = lowerBound(uniq, prev[i])
}
fw := NewFenwick(len(uniq))
for i := 0; i < nPrev; i++ {
fw.Add(idxPrev[i], 1)
}
total := nPrev
res := make([]int64, nCurr)
for i := 0; i < nCurr; i++ {
for _, p := range banned[i] {
fw.Add(idxPrev[p], -1)
total--
}
if total == 0 {
res[i] = INF
} else {
minIdx := fw.Kth(1)
minVal := uniq[minIdx]
if minVal >= INF/2 {
res[i] = INF
} else {
sum := base[i] + minVal
if sum >= INF {
sum = INF
}
res[i] = sum
}
}
for _, p := range banned[i] {
fw.Add(idxPrev[p], 1)
total++
}
}
return res
}
func main() {
fs := NewFastScanner()
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
n1 := fs.NextInt()
n2 := fs.NextInt()
n3 := fs.NextInt()
n4 := fs.NextInt()
a := make([]int64, n1)
for i := 0; i < n1; i++ {
a[i] = int64(fs.NextInt())
}
b := make([]int64, n2)
for i := 0; i < n2; i++ {
b[i] = int64(fs.NextInt())
}
c := make([]int64, n3)
for i := 0; i < n3; i++ {
c[i] = int64(fs.NextInt())
}
d := make([]int64, n4)
for i := 0; i < n4; i++ {
d[i] = int64(fs.NextInt())
}
m1 := fs.NextInt()
bad12 := make([][]int, n2)
for i := 0; i < m1; i++ {
x := fs.NextInt() - 1
y := fs.NextInt() - 1
bad12[y] = append(bad12[y], x)
}
m2 := fs.NextInt()
bad23 := make([][]int, n3)
for i := 0; i < m2; i++ {
x := fs.NextInt() - 1
y := fs.NextInt() - 1
bad23[y] = append(bad23[y], x)
}
m3 := fs.NextInt()
bad34 := make([][]int, n4)
for i := 0; i < m3; i++ {
x := fs.NextInt() - 1
y := fs.NextInt() - 1
bad34[y] = append(bad34[y], x)
}
dp1 := a
dp2 := computeNext(b, dp1, bad12)
dp3 := computeNext(c, dp2, bad23)
dp4 := computeNext(d, dp3, bad34)
ans := INF
for _, v := range dp4 {
if v < ans {
ans = v
}
}
if ans >= INF/2 {
out.WriteString("-1\n")
} else {
buf := make([]byte, 0, 32)
if ans == 0 {
buf = append(buf, '0')
} else {
x := ans
neg := false
if x < 0 {
neg = true
x = -x
}
tmp := make([]byte, 0, 32)
for x > 0 {
tmp = append(tmp, byte('0'+x%10))
x /= 10
}
if neg {
buf = append(buf, '-')
}
for i := len(tmp) - 1; i >= 0; i-- {
buf = append(buf, tmp[i])
}
}
buf = append(buf, '\n')
out.Write(buf)
}
}