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 gcd(int a, int b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
pair<int, int> val[100000];
map<pair<int, int>, set<int> > C;
int rev(int a) {
  int ans = 0;
  while (a) ans = ans * 10 + a % 10, a /= 10;
  return ans;
}
struct by_x {
  bool operator()(const pair<int, int>& a, const pair<int, int>& b) {
    if (a.first == b.first) return a.second < b.second;
    return a.first < b.first;
  }
};
struct by_y {
  bool operator()(const pair<int, int>& a, const pair<int, int>& b) {
    if (a.second == b.second) return a.first < b.first;
    return a.second < b.second;
  }
};
int main() {
  int X, Y, W;
  cin >> X >> Y >> W;
  for (int i = (1); i <= (max(X, Y)); ++i) {
    int r = rev(i);
    int g = gcd(i, r);
    val[i] = make_pair(i / g, r / g);
    C[val[i]].insert(i);
  }
  vector<pair<int, int> > evt;
  for (int a = (1); a <= (X); ++a) {
    pair<int, int> p = val[a];
    swap(p.first, p.second);
    for (set<int>::iterator it = C[p].begin(); it != C[p].end(); it++) {
      int b = (*it);
      if (b > Y) continue;
      evt.push_back(make_pair(a, b));
      assert(a * (long long)b == rev(a) * (long long)rev(b));
    }
  }
  int N = evt.size();
  if (W > N) {
    cout << -1 << endl;
    return 0;
  }
  int bestx = X + 1;
  int besty = Y + 1;
  long long area = bestx * (long long)besty;
  priority_queue<pair<int, int>, vector<pair<int, int> >, by_y> Q;
  for (int i = 0; i < N; ++i) {
    Q.push(evt[i]);
    while (Q.size() > W) Q.pop();
    if (Q.size() < W) continue;
    int x = evt[i].first;
    int y = Q.top().second;
    if (x * (long long)y <= area) {
      area = x * (long long)y;
      bestx = x;
      besty = y;
    }
  }
  cout << bestx << " " << besty << endl;
  return 0;
}