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.util.*;
public class D {
    static long gcd(long a, long b) {
        if (a == 0)
            return b;
        return gcd(b % a, a);
    }

     public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        PrintWriter pw = new PrintWriter(System.out);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int k = sc.nextInt();
        if((2l*n*m)%k!=0){pw.println("NO");pw.flush();return;}
        long a = 0;
        long b = 0;
        long g = gcd(2l*n,k);
        if(g!=1){
            n*=2;
            n/=g;
            k/=g;
            m/=k;
            a = n;
            b = m;
        }else{
            m*=2;
            g = gcd(m,k);
            m/=g;
            k/=g;
            n/=k;
            a = n;
            b = m;
        }
        pw.println("YES");
        pw.println("0 0");
        pw.println(a+" 0");
        pw.println("0 "+b);
        pw.flush();
        pw.close();
    }
    static class SparseTable {
        int A[], SpT[][];
        int opval = 1;
        // opval =1 => min , opval = 2 => gcd
        static int gcd(int a, int b) {
            if (a == 0)
                return b;
            return gcd(b % a, a);
        }
        int f(int a,int b){
            if(opval==1)
                return Math.min(a,b);
            else if (opval==2)
                return gcd(a,b);
            else if(opval==3)return Math.max(a,b);
            return 0;
        }
        SparseTable(int[] A,int opval) {
            this.opval =opval;
            int n = A.length;	this.A = A;
            int k = (int)Math.floor(Math.log(n) / Math.log(2)) + 1;
            SpT = new int[n][k];

            for (int i = 0; i < n; i++)
                SpT[i][0] = A[i]; 					// RMQ of sub array starting at index i and of length 2^0=1

            //overall time complexity = O(n log n)
            for (int j = 1; (1<<j) <= n; j++) {
                for (int i = 0; i + (1 << j) - 1 < n; i++)
                    SpT[i][j] = f(SpT[i][j - 1], SpT[i + (1 << (j-1))][j - 1]);
            }
        }
        int query(int i, int j) {
            if(i==j)return SpT[i][0];
            int k = 0;
            while((1<<k)<j-i+1){
                k++;
            }
            if((1<<k)>j-i+1)k--;
            return f(SpT[i][k],SpT[j-(1<<k)+1][k]);
        }
        void print(){
            for(int i=0;i<SpT[0].length;i++){
                for(int j=0;j<SpT.length;j++)
                    System.out.print(SpT[j][i] + " ");
                System.out.println();
            }
        }
    }
    static class FenwickTree { // one-based DS

        int n;
        int[] ft;

        FenwickTree(int size) { n = size; ft = new int[n+1]; }

        int rsq(int b) //O(log n)
        {
            int sum = 0;
            while(b > 0) { sum += ft[b]; b -= b & -b;}		//min?
            return sum;
        }

        int rsq(int a, int b) { return rsq(b) - rsq(a-1); }

        void point_update(int k, int val)	//O(log n), update = increment
        {
            while(k <= n) { ft[k] += val; k += k & -k; }		//min?
        }
        int get(int v){
            int sum =0;
            int id=0;
            for (int i =22;i>=0;i--){
                if (id+(1<<i)>n)
                    continue;
                if (sum+ft[id+(1<<i)]<v){
                    id+=(1<<i);
                    sum+=ft[id];
                }
            }
            return id+1;
        }
        public int findKthmin(int k){
            int a = 1;
            int b = n;
            int mid = 0;
            int res= 1;
            while (a<=b){
                mid = (a+b)/2;
                if(this.rsq(mid)>=k){
                    res =mid;
                    b = mid-1;
                }else{
                    a = mid+1;
                }
            }
            return res;
        }
    }
    static class Pair implements Comparable<Pair>{
        int x;
        int y;
        public Pair(int x,int y){
            this.x= x;
            this.y = y;
        }
        public int compareTo(Pair p){
            if(this.x==p.x)
                return Long.compare(this.y,p.y);
            return -Long.compare(this.x,p.x);
        }
        public String toString(){
            return x+ " " + y;
        }
    }
    static class Scanner {
        StringTokenizer st;
        BufferedReader br;

        public Scanner(FileReader r) {
            br = new BufferedReader(r);
        }

        public Scanner(InputStream s) {
            br = new BufferedReader(new InputStreamReader(s));
        }

        public String next() throws IOException {
            while (st == null || !st.hasMoreTokens())
                st = new StringTokenizer(br.readLine());
            return st.nextToken();
        }

        public int nextInt() throws IOException {
            return Integer.parseInt(next());
        }

        public long nextLong() throws IOException {
            return Long.parseLong(next());
        }

        public String nextLine() throws IOException {
            return br.readLine();
        }

        public double nextDouble() throws IOException {
            String x = next();
            StringBuilder sb = new StringBuilder("0");
            double res = 0, f = 1;
            boolean dec = false, neg = false;
            int start = 0;
            if (x.charAt(0) == '-') {
                neg = true;
                start++;
            }
            for (int i = start; i < x.length(); i++)
                if (x.charAt(i) == '.') {
                    res = Long.parseLong(sb.toString());
                    sb = new StringBuilder("0");
                    dec = true;
                } else {
                    sb.append(x.charAt(i));
                    if (dec)
                        f *= 10;
                }
            res += Long.parseLong(sb.toString()) / f;
            return res * (neg ? -1 : 1);
        }

        public boolean ready() throws IOException {
            return br.ready();

        }
    }
}