Problem:
Score : 200 points

Problem Statement

You are visiting a large electronics store to buy a refrigerator and a microwave.

The store sells A kinds of refrigerators and B kinds of microwaves. The i-th refrigerator ( 1 \le i \le A ) is sold at a_i yen (the currency of Japan), and the j-th microwave ( 1 \le j \le B ) is sold at b_j yen.

You have M discount tickets. With the i-th ticket ( 1 \le i \le M ), you can get a discount of c_i yen from the total price when buying the x_i-th refrigerator and the y_i-th microwave together. Only one ticket can be used at a time.

You are planning to buy one refrigerator and one microwave. Find the minimum amount of money required.

Constraints

All values in input are integers.

1 \le A \le 10^5

1 \le B \le 10^5

1 \le M \le 10^5

1 \le a_i , b_i , c_i \le 10^5

1 \le x_i \le A

1 \le y_i \le B

c_i \le a_{x_i} + b_{y_i}

Input

Input is given from Standard Input in the following format:

A B M
a_1 a_2 ... a_A
b_1 b_2 ... b_B
x_1 y_1 c_1
\vdots
x_M y_M c_M

Output

Print the answer.

Sample Input 1

2 3 1
3 3
3 3 3
1 2 1

Sample Output 1

5

With the ticket, you can get the 1-st refrigerator and the 2-nd microwave for 3+3-1=5 yen.

Sample Input 2

1 1 2
10
10
1 1 5
1 1 10

Sample Output 2

10

Note that you cannot use more than one ticket at a time.

Sample Input 3

2 2 1
3 5
3 5
2 2 2

Sample Output 3

6

You can get the 1-st refrigerator and the 1-st microwave for 6 yen, which is the minimum amount to pay in this case.
Note that using a ticket is optional.

Solution in Rust (1.15.1) (judge verdict: Runtime Error)

use std::io::*;

fn main() {
    let stdin = stdin();
    let mut handle = stdin.lock();
    let a: u64 = read(&mut handle);
    let b: u64 = read(&mut handle);
    let m: u64 = read(&mut handle);
    let mut a_vec: Vec<u64> = Vec::new();
    for _ in 0..a as usize {
        a_vec.push(read(&mut handle));
    }
    let mut b_vec: Vec<u64> = Vec::new();
    for _ in 0..b as usize {
        b_vec.push(read(&mut handle));
    }
    let mut x_y_c: Vec<(u64, u64, u64)> = Vec::new();
    for _ in 0..m as usize {
        x_y_c.push({
            let x = read(&mut handle);
            let y = read(&mut handle);
            let c = read(&mut handle);
            (x, y, c)
        });
    }

    let mut result_pair: (u64, u64) = (0, 0);
    if a > 0 {
        for i in 1..a_vec.len() {
            if a_vec.get(result_pair.0 as usize).unwrap() > a_vec.get(i).unwrap() {
                result_pair.0 = *a_vec.get(i).unwrap();
            }
            if b_vec.get(result_pair.1 as usize).unwrap() > b_vec.get(i).unwrap() {
                result_pair.1 = *b_vec.get(i).unwrap();
            }
        }
    }

    let mut total =
        a_vec.get(result_pair.0 as usize).unwrap() + b_vec.get(result_pair.1 as usize).unwrap();
    for (xi, yi, c) in x_y_c {
        if total > a_vec.get(xi as usize - 1).unwrap() + b_vec.get(yi as usize - 1).unwrap() - c {
            total = a_vec.get(xi as usize - 1).unwrap() + b_vec.get(yi as usize - 1).unwrap() - c;
        }
    }

    println!("{}", total);
}

fn read(handle: &mut StdinLock) -> u64 {
    handle
        .bytes()
        .map(|c| c.unwrap() as char)
        .skip_while(|c| c.is_whitespace())
        .take_while(|c| !c.is_whitespace())
        .fold(0, |acc, x| (x as u8 - b'0') as u64 + acc * 10)
}