#include <bits/stdc++.h>
using namespace std;
double cross(complex<double> a, complex<double> b) { return imag(b * conj(a)); }
double dot(complex<double> a, complex<double> b) { return real(b * conj(a)); }
double Arg(complex<double> a, complex<double> b) { return arg(b * conj(a)); }
double eps = 1e-5;
double PI = acos(-1.0);
bool eq(double a, double b) { return (-eps < a - b && a - b < eps); }
double Sqrt(double x) { return sqrt(max(0.0, x)); }
struct S {
  complex<double> p, q;
  S(complex<double> p, complex<double> q) : p(p), q(q) {}
};
struct C {
  complex<double> p;
  double r;
  C(complex<double> p, double r) : p(p), r(r) {}
  C(double x, double y, double r) : p(complex<double>(x, y)), r(r) {}
};
vector<complex<double> > intersect(C a, C b) {
  vector<complex<double> > res;
  complex<double> base = b.p - a.p;
  double dist = abs(base);
  if (dist > a.r + b.r + eps) return res;
  if (dist < abs(a.r - b.r) - eps) return res;
  double ca = (a.r * a.r + dist * dist - b.r * b.r) / (2.0 * a.r * dist);
  complex<double> fi =
      a.p + base / dist * a.r * complex<double>(ca, Sqrt(1.0 - ca * ca));
  complex<double> se =
      a.p + base / dist * a.r * complex<double>(ca, -Sqrt(1.0 - ca * ca));
  res.push_back(fi);
  if (abs(fi - se) > eps) res.push_back(se);
  return res;
}
double intersectArea(C a, C b) {
  double dist = abs(a.p - b.p);
  if (dist > a.r + b.r + eps) return 0;
  if (dist < abs(a.r - b.r) + eps) return min(a.r * a.r, b.r * b.r) * PI;
  vector<complex<double> > v = intersect(a, b);
  if (v.size() < 2) return 0;
  double sa = 0, sb = 0;
  sa = a.r * a.r * PI * abs(Arg(v[0] - a.p, v[1] - a.p)) / (2.0 * PI);
  sa -= abs(cross(v[0] - a.p, v[1] - a.p)) / 2.0;
  sb = b.r * b.r * PI * abs(Arg(v[0] - b.p, v[1] - b.p)) / (2.0 * PI);
  sb -= abs(cross(v[0] - b.p, v[1] - b.p)) / 2.0;
  if (dot(b.p - a.p, v[0] - a.p) < 0) {
    sa = a.r * a.r * PI - sa;
  }
  if (dot(a.p - b.p, v[0] - b.p) < 0) {
    sb = b.r * b.r * PI - sb;
  }
  return sa + sb;
}
void pr(complex<double> p) { printf("%.10f %.10f\n", p.real(), p.imag()); }
int main() {
  while (1) {
    double H, W;
    double A, B, AB;
    cin >> W >> H >> A >> B >> AB;
    if (H == 0 && W == 0) break;
    bool flg = false;
    if (A < B) {
      flg = true;
      swap(A, B);
    }
    double ar = sqrt(A / PI);
    double br = sqrt(B / PI);
    if (max(ar, br) * 2 > min(H, W) + eps) {
      cout << "impossible" << endl;
      continue;
    }
    double L = abs(ar - br), R = ar + br, M;
    for (int i = 0; i < 100; i++) {
      M = (L + R) / 2.0;
      double val = intersectArea(C(0, 0, ar), C(M, 0, br));
      if (val <= AB)
        R = M;
      else
        L = M;
    }
    complex<double> pa = complex<double>(ar, ar);
    complex<double> pb = complex<double>(H - br, W - br);
    if (!eq(intersectArea(C(0, 0, ar), C(L, 0, br)), AB)) {
      cout << "impossible" << endl;
    } else {
      complex<double> base = pb - pa;
      base /= abs(base);
      base *= L;
      pb = pa + base;
      if (real(pb) + br < W + eps && imag(pb) + br < H + eps &&
          -eps < real(pb) - br && imag(pb) - br > -eps) {
        if (flg) {
          swap(pa, pb);
          swap(ar, br);
        }
        printf("%.8f %.8f %.8f %.8f %.8f %.8f\n", real(pa), imag(pa), ar,
               real(pb), imag(pb), br);
      } else {
        cout << "impossible" << endl;
      }
    }
  }
  return 0;
}
