#include <iostream>
#include <cstdio>
#include <cassert>
#include <cstring>
#include <vector>
#include <valarray>
#include <array>
#include <queue>
#include <set>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <algorithm>
#include <cmath>
#include <complex>
#include <random>

using namespace std;
typedef long long ll;
typedef unsigned long long ull;

typedef long double R;
typedef complex<R> P;

const R EPS = 1e-10;
const R PI = acos((R)(-1));

bool solve() {
    R w, h, a, b, ab;
    cin >> w >> h >> a >> b >> ab;
    if (!w) return false;
    bool ch = (a > b);
    if (ch) {
        swap(a, b);
    }
    R ra = sqrt(a/PI);
    R rb = sqrt(b/PI);
    if (min(w, h) < 2*ra || min(w, h) < 2*rb) {
        cout << "impossible" << endl;
        return true;
    }
    R l = 0, r = PI;
    for (int i = 0; i < 100; i++) {
        R md1 = (l+r)/2;
        R md2 = asin(ra/rb*sin(md1));
        R sm = 0;
        sm += ra*ra*(md1 - sin(md1)*cos(md1));
        sm += rb*rb*(md2 - sin(md2)*cos(md2));
        if (sm < ab) {
            l = md1;
        } else {
            r = md1;
        }
    }
    R l1 = l;
    R l2 = asin(ra/rb*sin(l1));
    R rc = ra*cos(l1)+rb*cos(l2);
//    cout << "debug " << ra << " " << rb << " " << rc << endl;
    if (abs(P(w-ra-rb, h-ra-rb)) < rc) {
        cout << "impossible" << endl;
        return true;
    }
    P ap, bp;
    bp = P(rb, rb);
    ap = bp + polar(rc, arg(P(w-ra-rb, h-ra-rb)));
    if (ch) {
        swap(ap, bp);
        swap(ra, rb);
    }
    printf("%.10Lf %.10Lf %.10Lf %.10Lf %.10Lf %.10Lf\n",
        ap.real(), ap.imag(), ra, bp.real(), bp.imag(), rb);
    return true;
}

int main() {
    while (solve()) {}
    return 0;
}