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;
long long N, M, K;
int p[400000];
map<long long, int> mpN, mpM, mpK;
vector<long long> prime, v;
void dfs(map<long long, int>::iterator it, long long ret) {
  if (it == mpN.end()) {
    v.push_back(ret);
    return;
  }
  long long k = 1;
  dfs(next(it), ret);
  int siz = it->second;
  while (siz > 0) {
    k *= it->first;
    siz--;
    dfs(next(it), ret * k);
  }
}
int main() {
  for (long long i = 2; i * i <= 1e9; i++) {
    if (!p[i]) {
      prime.push_back(i);
      for (long long j = 2 * i; j * j <= 1e9; j += 2 * i) {
        p[i] = 1;
      }
    }
  }
  scanf("%lld %lld %lld", &N, &M, &K);
  if ((2 * N * M) % K) {
    return !printf("NO");
  }
  long long S = 2 * N * M / K;
  long long oN = N, oM = M;
  for (long long x : prime) {
    while (N % x == 0) {
      mpN[x]++;
      N /= x;
    }
    while (M % x == 0) {
      mpM[x]++;
      M /= x;
    }
    while (K % x == 0) {
      mpK[x]++;
      K /= x;
    }
  }
  mpN[2]++;
  if (N != 1) mpN[N]++;
  if (M != 1) mpN[M]++;
  if (K != 1) {
    mpN[K]--;
    if (mpN[K] == 0) mpN.erase(K);
  }
  for (auto it : mpM) {
    mpN[it.first] += it.second;
  }
  for (auto it : mpK) {
    mpN[it.first] -= it.second;
    if (mpN[it.first] <= 0) mpN.erase(it.first);
  }
  dfs(mpN.begin(), 1);
  sort(v.begin(), v.end());
  int it = upper_bound(v.begin(), v.end(), oN) - v.begin() - 1;
  if (v[it] <= oN && S / v[it] <= oM) {
    puts("YES");
    printf("0 0\n0 %lld\n%lld 0", S / v[it], v[it]);
    return 0;
  }
  it = upper_bound(v.begin(), v.end(), oM) - v.begin() - 1;
  if (v[it] <= oM && S / v[it] <= oN) {
    puts("YES");
    printf("0 0\n0 %lld\n%lld 0", v[it], S / v[it]);
    return 0;
  }
  printf("NO");
}
