Problem: In Walrusland public transport tickets are characterized by two integers: by the number of the series and by the number of the ticket in the series. Let the series number be represented by a and the ticket number — by b, then a ticket is described by the ordered pair of numbers (a, b). 

The walruses believe that a ticket is lucky if a * b = rev(a) * rev(b). The function rev(x) reverses a number written in the decimal system, at that the leading zeroes disappear. For example, rev(12343) = 34321, rev(1200) = 21.

The Public Transport Management Committee wants to release x series, each containing y tickets, so that at least w lucky tickets were released and the total number of released tickets (x * y) were minimum. The series are numbered from 1 to x inclusive. The tickets in each series are numbered from 1 to y inclusive. The Transport Committee cannot release more than maxx series and more than maxy tickets in one series.

Input

The first line contains three integers maxx, maxy, w (1 ≤ maxx, maxy ≤ 105, 1 ≤ w ≤ 107).

Output

Print on a single line two space-separated numbers, the x and the y. If there are several possible variants, print any of them. If such x and y do not exist, print a single number  - 1.

Examples

Input

2 2 1


Output

1 1

Input

132 10 35


Output

7 5

Input

5 18 1000


Output

-1


Input

48 132 235


Output

22 111

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
vector<long long> re, r;
bool ire[110000];
template <class typ>
struct BIT {
  vector<typ> x;
  BIT(int n) : x(n, 0) {}
  typ sum(int a, int b) {
    if (a == 0) {
      typ s = 0;
      for (int i = b; i >= 0; i = (i & (i + 1)) - 1) s += x[i];
      return s;
    } else
      return sum(0, b) - sum(0, a - 1);
  }
  void add(int ind, typ f) {
    for (int i = ind; i < x.size(); i |= i + 1) x[i] += f;
  }
};
int gcd(int m, int n) {
  int a = max(m, n), b = min(m, n);
  if (m == 0) return n;
  if (n == 0) return m;
  if (a % b == 0) return b;
  return gcd(b, a - b * (a / b));
}
int rev(int a) {
  int ret = 0;
  while (a > 0) {
    ret = ret * 10 + a % 10;
    a /= 10;
  }
  return ret;
}
int main() {
  BIT<int> bit(110000);
  long long inf = 1000000000000LL, ma = inf, outx = -1, outy = -1, ny, i, j,
            maxx, maxy, w;
  cin >> maxx >> maxy >> w;
  ny = maxy;
  memset(ire, false, sizeof(ire));
  re.push_back(0);
  for (i = 1; i < 110000; i++) re.push_back(rev(i));
  for (i = 1; i < re.size(); i++) {
    if (i == re[i]) {
      r.push_back(i);
      ire[i] = true;
    }
  }
  for (i = 1; i <= maxx; i++) {
    if (ire[i]) {
      for (j = 0; j < r.size(); j++) bit.add((int)r[j], 1);
    } else {
      int g = gcd(i, re[i]);
      for (j = 1; j * re[i] / g <= maxy; j++) {
        if (re[j * re[i] / g] == j * i / g) bit.add((int)(j * re[i] / g), 1);
      }
    }
    while (bit.sum(0, ny - 1) >= w) ny--;
    if (bit.sum(0, ny) >= w && i * ny <= ma) {
      ma = i * ny;
      outx = i;
      outy = ny;
    }
  }
  if (ma >= inf)
    cout << "-1" << endl;
  else
    cout << outx << ' ' << outy << endl;
  return 0;
}