Problem: The Olympic Games in Bercouver are in full swing now. Here everyone has their own objectives: sportsmen compete for medals, and sport commentators compete for more convenient positions to give a running commentary. Today the main sport events take place at three round stadiums, and the commentator's objective is to choose the best point of observation, that is to say the point from where all the three stadiums can be observed. As all the sport competitions are of the same importance, the stadiums should be observed at the same angle. If the number of points meeting the conditions is more than one, the point with the maximum angle of observation is prefered. 

Would you, please, help the famous Berland commentator G. Berniev to find the best point of observation. It should be noted, that the stadiums do not hide each other, the commentator can easily see one stadium through the other.

Input

The input data consists of three lines, each of them describes the position of one stadium. The lines have the format x, y, r, where (x, y) are the coordinates of the stadium's center ( - 103 ≤ x, y ≤ 103), and r (1 ≤ r ≤ 103) is its radius. All the numbers in the input data are integer, stadiums do not have common points, and their centers are not on the same line. 

Output

Print the coordinates of the required point with five digits after the decimal point. If there is no answer meeting the conditions, the program shouldn't print anything. The output data should be left blank.

Examples

Input

0 0 10
60 0 10
30 30 10


Output

30.00000 0.00000

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
namespace QoE_Library {
namespace QL_Bare_Minimum {
const double PI = 3.141592653589793238460;
const long double pi = 10000 * acos(-1.0L);
const long double E = 2.7182818284590452353;
const long double eps = 1e-10;
const int DX4[] = {0, 1, 0, -1};
const int DY4[] = {1, 0, -1, 0};
const int DX8[] = {-1, -1, -1, 0, 0, 1, 1, 1};
const int DY8[] = {-1, 0, 1, -1, 1, -1, 0, 1};
const int neigh4[][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
const int neigh8[][2] = {{-1, 0}, {-1, -1}, {0, -1}, {1, -1},
                         {1, 0},  {1, 1},   {0, 1},  {-1, 1}};
const int neigh9[][2] = {{-1, 0}, {-1, -1}, {0, -1}, {1, -1}, {1, 0},
                         {1, 1},  {0, 1},   {-1, 1}, {0, 0}};
template <typename T1>
class Vector3D {
 public:
  T1 x, y, z;
  Vector3D(T1 x1, T1 y1, T1 z1) : x(x1), y(y1), z(z1) {}
  Vector3D() {}
};
template <typename T1>
inline T1 to_type(string s) {
  T1 a;
  istringstream sin(s);
  sin >> a;
  return a;
}
template <typename T1>
inline string to_str(T1 a) {
  ostringstream sout;
  string s;
  sout >> a;
  return sout.str();
}
inline void inpS(char *a) { scanf("%s", a); }
inline int inpI() {
  int n = 0;
  int ch = getchar();
  int sign = 1;
  while (ch < '0' || ch > '9') {
    if (ch == '-') sign = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9')
    n = (n << 3) + (n << 1) + ch - '0', ch = getchar();
  n = n * sign;
  return n;
}
inline void inpI2(int &a, int &b) {
  a = inpI();
  b = inpI();
}
inline void inpI3(int &a, int &b, int &c) {
  a = inpI();
  b = inpI();
  c = inpI();
}
inline double inpD() {
  double res = 0.0;
  char c;
  while (1) {
    c = getchar();
    if (c == ' ' || c == '\n')
      continue;
    else
      break;
  }
  res = c - '0';
  while (1) {
    c = getchar();
    if (c >= '0' && c <= '9')
      res = 10 * res + c - '0';
    else
      break;
  }
  if (c == '.') {
    double decimal = 0.0, divi = 1.0;
    while (1) {
      c = getchar();
      if (c >= '0' && c <= '9')
        decimal += (c - '0') / (divi *= 10.0);
      else
        break;
    }
    res += decimal;
  }
  return res;
}
inline void outpD(double N) {
  char buff[24], sz = 0;
  int integer = N;
  int decimal = (N - integer) * 10000000;
  int tmp = decimal;
  while (decimal) {
    buff[sz++] = '0' + decimal % 10;
    decimal /= 10;
  }
  for (int decimal2 = 1000000; decimal2 > tmp; decimal2 /= 10) {
    buff[sz++] = '0';
  }
  buff[sz++] = '.';
  if (integer == 0) buff[sz++] = '0';
  while (integer) {
    buff[sz++] = '0' + integer % 10;
    integer /= 10;
  }
  while (--sz >= 0) putchar(buff[sz]);
  putchar(10);
}
inline void outpI(int a) {
  char c;
  char snum[20];
  int i = 0;
  int sign = 0;
  if (a < 0) sign = 1;
  a = abs(a);
  do {
    snum[i++] = a % 10 + 48;
    a = a / 10;
  } while (a != 0);
  i = i - 1;
  if (sign) putchar('-');
  while (i >= 0) putchar(snum[i--]);
  putchar('\n');
}
inline void outpI2(int a, int b) {
  printf("%d ", a);
  outpI(b);
}
inline int outpS(char *s) { return printf("%s\n", s); }
template <typename T1>
void QL_swap(T1 &x, T1 &y) {
  T1 tmp;
  tmp = x;
  x = y;
  y = tmp;
}
template <typename T1>
T1 gcd(T1 a, T1 b) {
  if (!b) return a;
  return gcd(b, a % b);
}
long long int euclideanDistSq(long long int x1, long long int y1,
                              long long int x2, long long int y2) {
  return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
}
template <typename T>
long double euclideanDist(T x1, T y1, T x2, T y2) {
  return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}
template <typename T1>
T1 dotProd(T1 x1, T1 y1, T1 z1, T1 x2, T1 y2, T1 z2) {
  return x1 * x2 + y1 * y2 + z1 * z2;
}
template <typename T1>
Vector3D<T1> crossProd(Vector3D<T1> v1, Vector3D<T1> v2) {
  Vector3D<T1> v;
  v.x = v1.y * v2.z - v2.y * v1.z;
  v.y = v1.z * v2.x - v2.z * v1.x;
  v.z = v1.x * v2.y - v2.x * v1.y;
  return v;
}
}  // namespace QL_Bare_Minimum
}  // namespace QoE_Library
using namespace QoE_Library::QL_Bare_Minimum;
long double xy[2][3], r[3], c[2];
long double costFunc(long double x, long double y) {
  long double s = 0;
  long double absVal[3];
  for (int i = (0); i < (3); i = i + (1)) {
    absVal[i] = euclideanDist(xy[0][i], xy[1][i], x, y) / r[i];
  }
  for (int i = (0); i < (3); i = i + (1)) {
    long double t = (absVal[i] - absVal[(i + 1) % 3]);
    s += t * t;
  }
  return s;
}
int main() {
  for (int i = (0); i < (3); i = i + (1)) {
    cin >> xy[0][i] >> xy[1][i] >> r[i];
    c[0] += xy[0][i];
    c[1] += xy[1][i];
  }
  c[0] /= 3, c[1] /= 3;
  long double delta = 1;
  while (delta > 1e-6) {
    bool f = 0;
    for (int j = (0); j < (4); j = j + (1)) {
      if (costFunc(c[0] + DX4[j] * delta, c[1] + DY4[j] * delta) <
          costFunc(c[0], c[1])) {
        c[0] += DX4[j] * delta, c[1] += DY4[j] * delta;
        f = 1;
        break;
      }
    }
    if (!f) delta /= 2;
  }
  long double err = costFunc(c[0], c[1]);
  if (err > 1e-6) return 0;
  cout << setprecision(7) << fixed << c[0] << " " << c[1] << endl;
}