#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-8;
struct point {
  double x, y;
  point() {}
  point(double _x, double _y) : x(_x), y(_y) {}
  point operator+(const point &that) const {
    return point(x + that.x, y + that.y);
  }
  point operator-(const point &that) const {
    return point(x - that.x, y - that.y);
  }
  double operator*(const point &that) const { return x * that.y - that.x * y; }
  point operator*(const double &that) const {
    return point(x * that, y * that);
  }
  point normal() { return point(y, -x); }
  double length() { return hypot(x, y); }
  double polar() { return atan2(y, x); }
};
int sign(double x) {
  if (fabs(x) < eps) return 0;
  return x > 0 ? 1 : -1;
}
point intersection(const point &u1, const point &u2, const point &v1,
                   const point &v2) {
  return u1 + (u2 - u1) * (((u1 - v1) * (v1 - v2)) / ((u1 - u2) * (v1 - v2)));
}
struct data {
  char sta;
  point u, v, c;
  double r;
};
int totRet;
point c[3], tmpRet[2];
double r[3];
data tmp[2];
double disptop(const point &u, const point &v) {
  return hypot(u.x - v.x, u.y - v.y);
}
data get(int a, int b) {
  data ret;
  if (sign(r[a] - r[b]) == 0) {
    ret.sta = 'L';
    ret.u = (c[a] + c[b]) * 0.5;
    ret.v = ret.u + (c[a] - c[b]).normal();
  } else {
    ret.sta = 'C';
    ret.u = c[a] + (c[b] - c[a]) * (r[a] / (r[a] + r[b]));
    ret.v = c[b] + (c[a] - c[b]) * (r[b] / (r[b] - r[a]));
    ret.c = (ret.u + ret.v) * 0.5;
    ret.r = disptop(ret.c, ret.u);
  }
  return ret;
}
int intersectLinetoCir(point u, point v, point c, double r) {
  return sign(fabs((u - c) * (v - c) / disptop(u, v)) - r) <= 0;
}
void intersectionLinetoCir(point u, point v, point c, double r, point &ret1,
                           point &ret2) {
  point tmp = intersection(c, c + (u - v).normal(), u, v);
  double dis = disptop(tmp, c);
  dis = r * r - dis * dis;
  dis = dis < 0 ? 0 : sqrt(dis);
  dis /= disptop(u, v);
  ret1 = tmp + (u - v) * dis;
  ret2 = tmp - (u - v) * dis;
}
int intersectCirtoCir(point c1, double r1, point c2, double r2) {
  double tmp = disptop(c1, c2);
  return sign(tmp - (r1 + r2)) <= 0 && sign(tmp - fabs(r1 - r2)) >= 0;
}
void intersectionCirtoCir(point c1, double r1, point c2, double r2, point &ret1,
                          point &ret2) {
  double d = disptop(c1, c2);
  d = (1 + (r1 * r1 - r2 * r2) / d / d) * 0.5;
  point u = c1 + (c2 - c1) * d;
  point v = u + (c2 - c1).normal();
  intersectionLinetoCir(u, v, c1, r1, ret1, ret2);
}
void getIntersectionDatatoData(data a, data b) {
  point tmp1, tmp2;
  if (a.sta == 'L' && b.sta == 'L') {
    tmpRet[totRet++] = intersection(a.u, a.v, b.u, b.v);
  } else if (a.sta == 'C' && b.sta == 'C') {
    if (intersectCirtoCir(a.c, a.r, b.c, b.r)) {
      intersectionCirtoCir(a.c, a.r, b.c, b.r, tmp1, tmp2);
      tmpRet[totRet++] = tmp1;
      tmpRet[totRet++] = tmp2;
    }
  } else {
    if (a.sta == 'C') swap(a, b);
    if (intersectLinetoCir(a.u, a.v, b.c, b.r)) {
      intersectionLinetoCir(a.u, a.v, b.c, b.r, tmp1, tmp2);
      tmpRet[totRet++] = tmp1;
      tmpRet[totRet++] = tmp2;
    }
  }
}
int check(point u) {
  double R[3];
  for (int i = 0; i < 3; ++i) R[i] = disptop(u, c[i]);
  return !sign(r[0] * R[1] - r[1] * R[0]) && !sign(r[0] * R[2] - r[2] * R[0]);
}
void solve() {
  for (int i = 0; i < 3; ++i) {
    scanf("%lf%lf%lf", &c[i].x, &c[i].y, &r[i]);
  }
  tmp[0] = get(0, 1);
  tmp[1] = get(1, 2);
  totRet = 0;
  getIntersectionDatatoData(tmp[0], tmp[1]);
  int flag = false;
  point ans;
  double rate, rr;
  for (int i = 0; i < totRet; ++i)
    if (check(tmpRet[i])) {
      if (!flag) {
        ans = tmpRet[i];
        rate = disptop(ans, c[0]);
      } else {
        rr = disptop(tmpRet[i], c[0]);
        if (rr < rate) {
          rate = rr;
          ans = tmpRet[i];
        }
      }
      flag = true;
    }
  if (flag) printf("%.5f %.5f\n", ans.x, ans.y);
}
int main() {
  solve();
  return 0;
}
