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;
int m1[100001];
vector<int> m2[100001];
map<int, int> mp[100001];
int main() {
  int n = 1;
  int maxx, maxy, w;
  cin >> maxx >> maxy >> w;
  for (int i = 1; i <= maxx; i++) {
    int x = i, y = 0;
    while (x) {
      y = y * 10 + (x % 10);
      x /= 10;
    }
    x = i;
    int g = x, b = y;
    while (b) {
      int x2 = b;
      b = g % b;
      g = x2;
    }
    x /= g;
    y /= g;
    g = mp[x][y];
    if (!g) {
      mp[x][y] = n++;
      g = n - 1;
    }
    m1[i] = g;
  }
  n = 0;
  for (int i = 1; i <= maxy; i++) {
    int x = i, y = 0;
    while (x) {
      y = y * 10 + (x % 10);
      x /= 10;
    }
    x = i;
    int g = x, b = y;
    while (b) {
      int x2 = b;
      b = g % b;
      g = x2;
    }
    x /= g;
    y /= g;
    g = mp[y][x];
    if (g) {
      m2[g].push_back(i);
      n = max(n, (int)m2[g].size());
    }
  }
  long long MH = (long long)(maxx + 1ll) * (long long)(maxy + 1ll);
  long long l = 0, h = MH;
  while (l <= h) {
    long long m = (l + h) / 2ll;
    int t = 0;
    int cnt = 0;
    priority_queue<int> q;
    for (int x = 1; x <= maxx && !t; x++) {
      long long h2 = m / x;
      while (!q.empty() && q.top() > h2) q.pop();
      int y = m1[x];
      for (int i = 0; i < m2[y].size() && m2[y][i] <= h2; i++) {
        q.push(m2[y][i]);
      }
      if (q.size() >= w) t = 1;
    }
    if (t)
      h = m - 1;
    else
      l = m + 1;
  }
  if (l < MH) {
    priority_queue<int> q;
    int t = 0;
    int x1, y1;
    for (int x = 1; x <= maxx && !t; x++) {
      while (!q.empty() && (long long)x * (long long)q.top() > l) q.pop();
      int y = m1[x];
      for (int i = 0;
           i < m2[y].size() && (long long)x * (long long)m2[y][i] <= l; i++)
        q.push(m2[y][i]);
      if (q.size() >= w) {
        t = 1;
        x1 = x;
        y1 = q.top();
      }
    }
    cout << x1 << " " << y1 << endl;
  } else
    cout << -1 << endl;
  return 0;
}