#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;

int sgn(R a) {
    if (a < -EPS) return -1;
    if (a > EPS) return 1;
    return 0;
}

int sgn(R a, R b) {
    return sgn(b-a);
}

bool near(P a, P b) {
    return !sgn(abs(a-b));
}

R cross(P a, P b) { return a.real()*b.imag() - a.imag()*b.real(); }
R dot(P a, P b) { return a.real()*b.real() + a.imag()*b.imag(); }

int ccw(P a, P b, P c) {
    if (near(a, c) || near(b, c)) return 0;
    int s = sgn(cross(b-a, c-a));
    if (s) return s;
    if (dot(b-a, c-a) < 0) return 2;
    if (dot(a-b, c-b) < 0) return -2;
    return 0;
}

struct L {
    P x, y;
    L() {};
    L(P x, P y) : x(x), y(y) {};
};

P vec(const L &l) {
    return l.y-l.x;
}

R distLP(const L &l, const P &p) {
    return abs(cross(vec(l), p-l.x)/abs(vec(l)));
}

R distSP(const L &s, const P &p) {
    P s2 = vec(s)*P(0, 1);
    if (ccw(s.x, s.x+s2, p) == 1) return abs(s.x-p);
    if (ccw(s.y, s.y+s2, p) == -1) return abs(s.y-p);
    return min(min(abs(s.x-p), abs(s.y-p)), distLP(s, p));
}

struct C {
    P p;
    R r;
    C() {}
    C(P p, R r) : p(p), r(r) {}
};

struct T {
    P d[3];
    T() {}
    T(P x, P y, P z) {
        d[0] = x; d[1] = y; d[2] = z;
    }
    P& operator[](int p) {
        return d[p];
    }
    const P& operator[](int p) const {
        return d[p];
    }
    int size() const {
        return 3;
    }
};

P cu(const T &t, int i) {
    return t[(i%3+3)%3];
}

//0:P is out 1:P is on line 2:P is in
int contains(const T &pol, P p) {
    int in = -1;
    for (int i = 0; i < (int)pol.size(); i++) {
        P a=cu(pol,i)-p, b=cu(pol,i+1)-p;
        if (ccw(a, b, P(0, 0)) == 0) return 1;
        if (imag(a) > imag(b)) swap(a, b);
        if (imag(a) <= 0 && 0 < imag(b)) {
            if (cross(a, b) < 0) in *= -1;
        }
    }
    return in+1;
}

bool solve() {
    T t;
    for (int i = 0; i < 3; i++) {
        double x, y;
        if (scanf("%lf %lf", &x, &y) != 2) return false;
        t[i] = P(x, y);
    }
    C c;
    double x, y;
    cin >> x >> y;
    c.p = P(x, y);
    double r;
    cin >> r;
    c.r = r;

    R ma = -1e9, mi = 1e9;
    for (int i = 0; i < 3; i++) {
        ma = max(ma, abs(t[i]-c.p));
        mi = min(mi, distSP(L(cu(t, i), cu(t, i+1)), c.p));
    }
//    cout << ma << " " << mi << endl;
    if (sgn(ma, c.r) != -1) {
        cout << "b" << endl;
        return true;
    }

    if (contains(t, c.p) != 0 && sgn(c.r, mi) != -1) {
        cout << "a" << endl;
        return true;
    }

    if (sgn(mi, c.r) != -1) {
        cout << "c" << endl;
        return true;
    }
    cout << "d" << endl;
    return true;
}

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