#include <bits/stdc++.h>
using namespace std;

typedef complex<double> P;

P in(){
	double a,b;
	cin >> a >> b;
	return P(a,b);
}
double dot(P a,P b){
	return (conj(a)*b).real();	
}
double cross(P a,P b){
	return (conj(a)*b).imag();
}

// a-b vs c
P pedal(P a,P b,P c){
	P v = b - a;
	P e = v / abs(v);
	P p = c - a;
	return a + e * dot(e,p);
}


double eps = 1e-9;
bool intersectSP(P a,P b,P c){
	return fabs( abs(a-b) - (abs(a-c) + abs(b-c)) ) < eps;
}



double distanceSP(P a,P b,P c){
	P pdl = pedal(a,b,c);
	double answer = min(abs(a-c),abs(b-c));
	if( intersectSP(a,b,pdl) ) answer = min(answer, abs(pdl-c) );
	return answer;
}


/*
a / a(a) * b
 
      a
----*------->
 .  |
 b\ |
   \|

*/
int main(){

	while(true){
		vector<P> p(3);
		for(int i = 0 ; i < 3 ; i++) p[i] = in();
	
		if( abs(p[0]) < eps ) return 0; // end
		P d = in();

		double R;
		cin >> R;
		for(int i = 0 ; i < 3 ; i++) p[i] -= d;

		vector<int> sgn;
		for(int i = 0 ; i < 3 ; i++){
			double s = cross(p[i],p[(i+1)%3]);
			if( s < 0 ) s = -1;
			else if( s > 0 ) s = +1;
			if(s) sgn.push_back(s);
		}
		bool isin = false;
		if( sgn.size() == 0 || count(sgn.begin(),sgn.end(),sgn[0]) == 3 ) isin = true;
		double dist = 1e9;

		for(int i = 0 ; i < 3 ; i++)
			dist = min(distanceSP(p[i],p[(i+1)%3],P(0,0)),dist);
		if( isin && dist > R - eps ){
			cout << "a" << endl;
		}else if( max( {abs(p[0]),abs(p[1]),abs(p[2])}) < R - eps ){
			cout << "b" << endl;
		}else if( !isin && dist > R + eps ){
			cout << "d" << endl;
		}else{
			cout << "c" << endl;
		}
	}



}