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.
#include <bits/stdc++.h>
using namespace std;
namespace BigPrimes {
long long gcd(long long a, long long b) { return a ? gcd(b % a, a) : b; }
long long mulmod(long long a, long long b, long long c) {
  long long x = 0, y = a % c;
  while (b > 0) {
    if (b % 2 == 1) x = (x + y) % c;
    y = (y * 2) % c;
    b /= 2;
  }
  return x % c;
}
long long expmod(long long b, long long e, long long m) {
  if (!e) return 1;
  long long q = expmod(b, e / 2, m);
  q = mulmod(q, q, m);
  return e % 2 ? mulmod(b, q, m) : q;
}
bool es_primo_prob(long long n, int a) {
  if (n == a) return true;
  long long s = 0, d = n - 1;
  while (d % 2 == 0) s++, d /= 2;
  long long x = expmod(a, d, n);
  if ((x == 1) || (x + 1 == n)) return true;
  for (int i = 0; i < s - 1; ++i) {
    x = mulmod(x, x, n);
    if (x == 1) return false;
    if (x + 1 == n) return true;
  }
  return false;
}
bool rabinPrime(long long n) {
  if (n == 1) return false;
  const int ar[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37};
  for (int j = 0; j < 12; ++j)
    if (!es_primo_prob(n, ar[j])) return false;
  return true;
}
long long rho(long long n) {
  if ((n & 1) == 0) return 2;
  long long x = 2, y = 2, d = 1;
  long long c = rand() % n + 1;
  while (d == 1) {
    x = (mulmod(x, x, n) + c) % n;
    y = (mulmod(y, y, n) + c) % n;
    y = (mulmod(y, y, n) + c) % n;
    if (x - y >= 0)
      d = gcd(x - y, n);
    else
      d = gcd(y - x, n);
  }
  return d == n ? rho(n) : d;
}
void factRho(long long n, map<long long, int> &prim) {
  if (n == 1) return;
  if (rabinPrime(n)) {
    prim[n]++;
    return;
  }
  long long factor = rho(n);
  factRho(factor, prim);
  factRho(n / factor, prim);
}
}  // namespace BigPrimes
long long best(long long sf, long long lim, const map<long long, int> &PF,
               map<long long, int>::iterator &it) {
  if (it == PF.end()) {
    return sf;
  }
  it++;
  long long w = best(sf, lim, PF, it);
  it--;
  for (int i = 0; i < (it->second); ++i) {
    if (sf * it->first > lim) break;
    sf *= it->first;
    it++;
    w = max(w, best(sf, lim, PF, it));
    it--;
  }
  return w;
}
int main() {
  long long N, M, K;
  cin >> N >> M >> K;
  long long A = N * M;
  if (2 * A % K != 0) {
    cout << "NO" << endl;
  } else {
    A = 2 * A / K;
    long long lX = 1;
    map<long long, int> PF;
    BigPrimes::factRho(A, PF);
    auto it = PF.begin();
    lX = best(1, N, PF, it);
    if (A / lX <= M) {
      cout << "YES" << endl;
      cout << 0 << " " << 0 << endl;
      cout << lX << " " << 0 << endl;
      cout << 0 << " " << A / lX << endl;
    } else {
      cout << "NO" << endl;
    }
  }
}
