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.beans.IntrospectionException;
import java.io.*;
import java.util.*;

public class Main {
    static OutWriter out;
    static InReader in;
    static int mod = (int) (1e9) + 7;


    public static void main(String args[]) throws IOException {
        in = new InReader();
        out = new OutWriter();
        long n = in.nextInt();
        long m = in.nextInt();
        long k = in.nextInt();
        if ((n * m * 2) % k != 0) {
            out.println("NO");
        } else {
            out.println("YES");
            long gcd = gcd(m, k);
            m = m / gcd;
            k = k / gcd;
            long gcd2 = gcd(n, k);
            n = n / gcd2;
            k = k / gcd2;
            if (n*2/k <= gcd2*n) {
                out.println(n * 2 / k + " " + 0);
                out.println(0 + " " + 0);
                out.println(0 + " " + m);
            } else {
                out.println(n + " " + 0);
                out.println(0 + " " + 0);
                out.println(0 + " " + m * 2 / k);
            }


        }

        out.close();
    }

    static long gcd(long a, long b) {
        if (b == 0) {
            return a;
        } else {
            return gcd(b, a % b);
        }
    }

    static class Pair implements Comparable<Pair> {
        int x;
        int y;


        Pair(int x, int y) {
            this.x = x;
            this.y = y;
        }

        @Override
        public int compareTo(Pair o) {
            if (x - o.x != 0) {
                return x - o.x;
            } else {
                if (y - o.y != 0) {
                    return -1;
                } else {
                    return 0;
                }
            }
        }
    }

    static class Vertex implements Comparable<Vertex> {
        int number;
        int deg;

        Vertex(int number, int deg) {
            this.number = number;
            this.deg = deg;
        }

        @Override
        public int compareTo(Vertex o) {
            if (deg != o.deg) {
                return deg - o.deg;
            } else {
                return number - o.number;
            }
        }
    }


    static class Edge {
        int to;
        int from;

        Edge(int from, int to) {
            this.from = from;
            this.to = to;
        }
    }

    static class InReader {
        BufferedReader in;

        InReader(String name) throws IOException {
            in = new BufferedReader(new FileReader(name));
        }

        InReader() {
            in = new BufferedReader(new InputStreamReader(System.in));
        }

        StringTokenizer token = new StringTokenizer("");

        void update() throws IOException {
            if (!token.hasMoreTokens()) {
                String a = in.readLine();
                if (a != null) {
                    token = new StringTokenizer(a);
                }
            }
        }

        int nextInt() throws IOException {
            update();
            return Integer.parseInt(token.nextToken());
        }

        long nextLong() throws IOException {
            update();
            return Long.parseLong(token.nextToken());
        }

        double nextDouble() throws IOException {
            update();
            return Double.parseDouble(token.nextToken());
        }

        boolean hasNext() throws IOException {
            update();
            return token.hasMoreTokens();
        }

        String next() throws IOException {
            update();
            return token.nextToken();
        }
    }

    static class OutWriter {
        PrintWriter out;

        OutWriter() {
            out = new PrintWriter(System.out);
        }

        OutWriter(String name) throws IOException {
            out = new PrintWriter(new FileWriter(name));
        }

        StringBuilder cout = new StringBuilder();

        <T> void print(T a) {
            cout.append(a);
        }

        <T> void println(T a) {
            cout.append(a);
            cout.append('\n');
        }

        <T> void prints(T a) {
            cout.append(a);
            cout.append(' ');
        }

        void close() {
            out.print(cout.toString());
            out.close();
        }
    }
}