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;
struct Node {
  double v;
  int id;
} s[100100];
const double eps = 1e-9;
int n, m, w, size[100100], tot;
double v[100100];
int rev(int x) {
  int t = 0;
  while (x) t = t * 10 + x % 10, x /= 10;
  return t;
}
bool cmp(Node x, Node y) { return x.v < y.v || (x.v == y.v && x.id < y.id); }
void prep() {
  for (int i = 1; i <= max(n, m); i++) {
    int x = rev(i);
    v[i] = (double)i / x;
    s[i].v = (double)x / i;
    s[i].id = i;
  }
  sort(s + 1, s + m + 1, cmp);
}
int dcmp(double x) {
  if (fabs(x) < eps) return 0;
  return x > eps ? 1 : -1;
}
int getwhe(int x) {
  int l = 1, r = m;
  while (l < r) {
    int mid = (l + r) >> 1;
    if (dcmp(s[mid].v - v[x]) < 0)
      l = mid + 1;
    else
      r = mid;
  }
  return l;
}
void work() {
  prep();
  int r = m, ans1, ans2;
  long long ans = (long long)1 << 50;
  for (int i = 1; i <= n; i++) {
    int str = getwhe(i);
    for (; str <= m && dcmp(s[str].v - v[i]) == 0 && s[str].id <= r; str++)
      tot++, size[s[str].id]++;
    while (tot - size[r] >= w) tot -= size[r], r--;
    if (tot >= w && (long long)i * r < ans)
      ans = (long long)i * r, ans1 = i, ans2 = r;
  }
  if (ans == (long long)1 << 50)
    cout << "-1";
  else
    cout << ans1 << " " << ans2;
}
int main() {
  cin >> n >> m >> w;
  work();
}