#include <bits/stdc++.h>
using namespace std;
bool PointEquals(pair<double, double> p1, pair<double, double> p2) {
  return abs(p1.first - p2.first) <= 1e-11 &&
         abs(p1.second - p2.second) <= 1e-11;
}
bool IsIntersecting(
    const pair<pair<double, double>, pair<double, double> >& segment1,
    const pair<pair<double, double>, pair<double, double> >& segment2,
    int* parallel, pair<double, double>* intersection_point) {
  double xx1 = segment1.first.first;
  double yy1 = segment1.first.second;
  double xx2 = segment1.second.first;
  double yy2 = segment1.second.second;
  double xx3 = segment2.first.first;
  double yy3 = segment2.first.second;
  double xx4 = segment2.second.first;
  double yy4 = segment2.second.second;
  *parallel = 0;
  if (fabs((yy4 - yy3) * (xx2 - xx1) - (xx4 - xx3) * (yy2 - yy1)) <= 1e-11) {
    *parallel = 1;
    if (PointEquals(segment1.first, segment2.first) ||
        PointEquals(segment1.first, segment2.second)) {
      *intersection_point = segment1.first;
      return true;
    } else if (PointEquals(segment1.second, segment2.first) ||
               PointEquals(segment1.second, segment2.second)) {
      *intersection_point = segment1.second;
      return true;
    }
    return false;
  }
  double ua = ((xx4 - xx3) * (yy1 - yy3) - (yy4 - yy3) * (xx1 - xx3)) /
              ((yy4 - yy3) * (xx2 - xx1) - (xx4 - xx3) * (yy2 - yy1));
  double& xi = (*intersection_point).first;
  double& yi = (*intersection_point).second;
  xi = xx1 + ua * (xx2 - xx1);
  yi = yy1 + ua * (yy2 - yy1);
  return ((xi + 1e-11 >= fmin(xx1, xx2)) && (xi - 1e-11 <= fmax(xx1, xx2)) &&
          (yi + 1e-11 >= fmin(yy1, yy2)) && (yi - 1e-11 <= fmax(yy1, yy2)) &&
          (xi + 1e-11 >= fmin(xx3, xx4)) && (xi - 1e-11 <= fmax(xx3, xx4)) &&
          (yi + 1e-11 >= fmin(yy3, yy4)) && (yi - 1e-11 <= fmax(yy3, yy4)));
}
double SegmentLength(pair<pair<double, double>, pair<double, double> > seg) {
  return sqrt((seg.first.first - seg.second.first) *
                  (seg.first.first - seg.second.first) +
              (seg.first.second - seg.second.second) *
                  (seg.first.second - seg.second.second));
}
double DistanceToLine(pair<pair<double, double>, pair<double, double> > line,
                      pair<double, double> point_x,
                      pair<double, double>* out_point = NULL) {
  pair<double, double> point_a, point_b;
  point_a = line.first;
  point_b = line.second;
  double cpx, cpy;
  double proj =
      ((point_x.first - point_a.first) * (point_b.first - point_a.first) +
       (point_x.second - point_a.second) * (point_b.second - point_a.second)) /
      ((point_b.first - point_a.first) * (point_b.first - point_a.first) +
       (point_b.second - point_a.second) * (point_b.second - point_a.second));
  cpx = point_a.first + proj * (point_b.first - point_a.first);
  cpy = point_a.second + proj * (point_b.second - point_a.second);
  if (out_point != NULL) {
    *out_point = make_pair(cpx, cpy);
  }
  return SegmentLength(make_pair(point_x, make_pair(cpx, cpy)));
}
double a, b;
double CalculateWidth(double length, double y) {
  pair<double, double> hit1 = make_pair(0.0, y);
  double x = sqrt(length * length - y * y);
  pair<double, double> hit2 = make_pair(x, 0.0);
  pair<double, double> hit;
  double jarak = DistanceToLine(make_pair(hit1, hit2), make_pair(a, b), &hit);
  if (hit.first > a + 1e-11 && hit.second > b + 1e-11) return -2.0;
  return jarak;
}
bool IsOk(double length, double width) {
  double bawah = 0.0;
  double atas = length;
  for (int(i) = 0; (i) < (400); ++(i)) {
    double low = bawah + (atas - bawah) * 1.0 / 3.0;
    double hi = bawah + (atas - bawah) * 2.0 / 3.0;
    double wid1 = CalculateWidth(length, low);
    double wid2 = CalculateWidth(length, hi);
    if (wid1 + 1e-11 < width || wid2 + 1e-11 < width) return false;
    if (wid1 < wid2) {
      atas = hi;
    } else {
      bawah = low;
    }
  }
  return true;
}
int main() {
  double l;
  cin >> a >> b >> l;
  double jawab = -2.0;
  if (l <= a) jawab = max((jawab), (b));
  if (l <= b) jawab = max((jawab), (a));
  double lb = 0.0;
  double ub = a;
  for (int(i) = 0; (i) < (300); ++(i)) {
    double mid = (lb + ub) / 2.0;
    if (IsOk(l, mid)) {
      jawab = max((jawab), (mid));
      lb = mid;
    } else {
      ub = mid;
    }
  }
  lb = 0.0;
  ub = b;
  for (int(i) = 0; (i) < (300); ++(i)) {
    double mid = (lb + ub) / 2.0;
    if (IsOk(mid, l)) {
      jawab = max((jawab), (mid));
      lb = mid;
    } else {
      ub = mid;
    }
  }
  if (jawab < 0.0) {
    cout << "My poor head =(" << endl;
  } else {
    printf("%.9lf\n", min(jawab, l));
  }
  return 0;
}
