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 rat {
  int x, y;
  rat() {}
  rat(int tx, int ty) {
    x = tx;
    y = ty;
  }
  rat flip() { return rat(y, x); }
  bool operator<(const rat& o) const {
    return (long long)x * o.y < (long long)o.x * y;
  }
  bool operator==(const rat& o) const {
    return (long long)x * o.y == (long long)o.x * y;
  }
};
int getrev(int a) {
  int t = 0;
  while (a) {
    t = (t * 10) + (a % 10);
    a /= 10;
  }
  return t;
}
int rev[100010];
multiset<rat> a, b;
int c = 0, ta = 0, tb = 0;
void inca() {
  ta++;
  rat t(ta, rev[ta]);
  a.insert(t);
  c += b.count(t.flip());
}
void incb() {
  tb++;
  rat t(tb, rev[tb]);
  b.insert(t);
  c += a.count(t.flip());
}
void decb() {
  rat t(tb, rev[tb]);
  if (b.find(t) == b.end()) {
    printf("ERR\n");
    fflush(stdout);
    exit(1);
  }
  b.erase(b.find(t));
  c -= a.count(t.flip());
  tb--;
}
int main() {
  for (int i = 1; i <= 100000; i++) rev[i] = getrev(i);
  int n, m, k;
  scanf("%d%d%d", &n, &m, &k);
  for (int i = 1; i <= m; i++) incb();
  long long best = 99999999999999LL;
  int ba = 0, bb = 0;
  for (int i = 1; i <= n; i++) {
    inca();
    while (tb != 0 && c >= k) decb();
    if (tb < m) incb();
    if (c >= k) {
      long long t = ta;
      t *= tb;
      if (t < best) {
        best = t;
        ba = ta;
        bb = tb;
      }
    }
  }
  if (best != 99999999999999LL)
    printf("%d %d\n", ba, bb);
  else
    printf("-1\n");
}