Vasya has got three integers n, m and k. He'd like to find three integer points (x_1, y_1), (x_2, y_2), (x_3, y_3), such that 0 ≤ x_1, x_2, x_3 ≤ n, 0 ≤ y_1, y_2, y_3 ≤ m and the area of the triangle formed by these points is equal to nm/k.

Help Vasya! Find such points (if it's possible). If there are multiple solutions, print any of them.

Input

The single line contains three integers n, m, k (1≤ n, m ≤ 10^9, 2 ≤ k ≤ 10^9).

Output

If there are no such points, print "NO".

Otherwise print "YES" in the first line. The next three lines should contain integers x_i, y_i — coordinates of the points, one point per line. If there are multiple solutions, print any of them.

You can print each letter in any case (upper or lower).

Examples

Input

4 3 3


Output

YES
1 0
2 3
4 1


Input

4 4 7


Output

NO

Note

In the first example area of the triangle should be equal to nm/k = 4. The triangle mentioned in the output is pictured below: 

<image>

In the second example there is no triangle with area nm/k = 16/7.
import java.io.*;
import java.math.*;
import java.util.*;

public class A {
	public static void main (String[] args) { new A(); }

	long target, n, m, k;
	boolean flag = false;
	
	A() {
		Scanner s = new Scanner(System.in);
		System.err.println("");

		n = s.nextLong();
		m = s.nextLong();
		k = s.nextLong();
		if((2*n*m) % k != 0) {
			System.out.println("NO");
			return;
		}
		target = (2*n*m)/k;
		
		ArrayList<long[]> primes = primes(PollardRho.getPrimeFactors(target));
		rec(1, primes, 0);
		if(!flag) System.out.println("NO");
	}
	
	void rec(long cur, ArrayList<long[]> primes, int idx) {
		if(cur > n) return;
		if(target/cur <= m) {
			System.out.println("YES");
			System.out.println("0 0");
			System.out.println(cur + " 0");
			System.out.println("0 " + (target/cur));
			flag = true;
			return;
		}
		if(idx == primes.size()) return;
		long[] a = primes.get(idx);
		
		long mult = 1;
		rec(cur, primes, idx+1);
		for(int i = 0; i < a[1] && !flag; i++) {
			mult *= a[0];
			rec(cur*mult, primes, idx+1);
		}
	}
	
	static long gcd(long a, long b) {
		if(b == 0) return a;
		return gcd(b, a % b);
	}
	
	static ArrayList<long[]> primes(ArrayList<Long> list) {
		Collections.sort(list);
		ArrayList<long[]> res = new ArrayList<>();
		for(int i = 0; i < list.size(); i++) {
			int j = i;
			while(j < list.size() && list.get(i) == list.get(j)) j++;
			res.add(new long[] {list.get(i), j-i});
			i = --j;
		}
		return res;
	}
	
	static class PollardRho {
		static Random r = new Random();
		static ArrayList<Long> getPrimeFactors(long n) {
			ArrayList<Long> factors = new ArrayList<>();
			getPrimeFactors(n, factors);
			return factors;
		}
		static void getPrimeFactors(long n, ArrayList<Long> factors) {
			if (n <= 1) {
			} else if (BigInteger.valueOf(n).isProbablePrime(30))  factors.add(n);
			else {
				long d = rho(n);  getPrimeFactors(d, factors);
				getPrimeFactors(n / d, factors);
			}
		}
		static long rho(long n) {
			if (n <= 3)  return -1;
			if ((n & 1) == 0)  return 2;
			long x, y, d;  BigInteger ab, nb;

			nb = BigInteger.valueOf(n);
			do {
				ab = BigInteger.valueOf(Math.abs(r.nextInt(100_000)) + 2);
				x = y = Math.abs(r.nextInt(100_000)) + 2;
				do {
					x = poly(x, ab, nb);  y = polypoly(y, ab, nb);
					d = gcd(n, Math.abs(x - y));
				} while (d == 1);
			} while (d == n);
			return d;
		}
		static long poly(long x, BigInteger ab, BigInteger nb) {
			BigInteger xb = BigInteger.valueOf(x);
			return xb.multiply(xb).add(ab).mod(nb).longValue();
		}
		static long polypoly(long x, BigInteger ab, BigInteger nb) {
			BigInteger xb = BigInteger.valueOf(x), p = xb.multiply(xb).add(ab);
			return p.multiply(p).add(ab).mod(nb).longValue();
		}
	}
	
}