#include<iostream>
#include<cmath>
#include<cstdlib>
#include<cassert>

#define SQRD(a) ((a)*(a))

using namespace std;

struct Point{ Point():x(0),y(0){}Point(double x, double y):x(x),y(y){}double x,y; };
struct Triangle{ Point a,b,c; };
struct Circle{ Circle():c(),r(0){} Circle(double x, double y, int r):c(x,y),r(r){}Point c; int r; };

ostream & operator << (ostream &os, const Point &p){
	os << "(" << p.x << "," << p.y << ")";
	return os;
}

inline double dist(const Point &p1, const Point &p2){
	return sqrt( SQRD(p2.x-p1.x)+SQRD(p2.y-p1.y) );
}
inline double dist(const Point &p1, const Point &p2, const Point &p)
{
	if( p1.x == p2.x ){
		return abs( p1.x - p.x );
	}else{
		double a = -(p2.y-p1.y)/double(p2.x-p1.x);
		double c = -a * p1.x - p1.y;

		return fabs( a * p.x + p.y + c ) / sqrt( SQRD(a) + 1 );
	}
}
inline bool isLeft(const Point &a, const Point &b, const Point &p){
	double vx = b.x - a.x, vy = b.y - a.y;
	double px = p.x - a.x, py = p.y - a.y;
	return (vx * py - px * vy) >= 0;
}
inline bool isRight(const Point &a, const Point &b, const Point &p){
	double vx = b.x - a.x, vy = b.y - a.y;
	double px = p.x - a.x, py = p.y - a.y;
	return (vx * py - px * vy) <= 0;
}

inline bool isInside(const Point &p, const Triangle &t )
{
	if( isLeft( t.a, t.b, p ) && isLeft( t.b, t.c, p ) && isLeft( t.c, t.a, p ) )
		return true;
	if( isRight( t.a, t.b, p ) && isRight( t.b, t.c, p ) && isRight( t.c, t.a, p ) )
		return true;
	return false;
}

bool Contains(const Triangle &t, const Circle &c)
{
	if( isInside( c.c, t ) ){
		if( c.r <= dist( t.a, t.b, c.c ) &&
			c.r <= dist( t.b, t.c, c.c ) &&
			c.r <= dist( t.c, t.a, c.c ) )
			return true;
	}
	return false;
}

bool IsContained(const Triangle &t, const Circle &c)
{
  if( dist( t.a, c.c ) <= c.r &&
	  dist( t.b, c.c ) <= c.r &&
	  dist( t.c, c.c ) <= c.r )
	  return true;
  else
	  return false;
}
bool isCross(const Point &p1, const Point &p2, const Circle &c)
{
	Point a1;
	Point a2;
	double d = dist(p1,p2,c.c);
	double l = dist(p1,p2);
			
	if( d > c.r )
		return false;
	else{
		if( p1.x != p2.x ){
			double a = (p2.y - p1.y) / (p2.x - p1.x);
			double b = -a * p1.x + p1.y;
			double A = 1 + SQRD(a);
			double B = a * b - c.c.x - a * c.c.y;
			double C = SQRD(c.c.x) + SQRD(c.c.y) - SQRD(c.r) + SQRD(b) - 2*b*c.c.y;

			a1.x = ( -B + sqrt( SQRD(B) - A * C ) ) / A;
			a2.x = ( -B - sqrt( SQRD(B) - A * C ) ) / A;
			a1.y = a * a1.x + b;
			a2.y = a * a2.x + b;
			
			//cout << a1 << ' ' << a2 << endl;

			if( dist(a1,p1) <= l && dist(a1,p2) <= l ||
				dist(a2,p1) <= l && dist(a2,p2) <= l )
				return true;
			else
				return false;
		}else{
			double e = sqrt( SQRD(c.r) - SQRD(d) );

			a1.x = p1.x; a1.y = c.c.y - e;
			a2.x = p2.x; a2.y = c.c.y + e;

			//cout << a1 << ' ' << a2 << endl;

			if( dist(a1,p1) <= l && dist(a1,p2) <= l ||
				dist(a2,p1) <= l && dist(a2,p2) <= l )
				return true;
			else
				return false;
		}
	}
}
bool isCross(const Triangle &t, const Circle &c ){

	if( isCross(t.a,t.b,c) || isCross(t.b,t.c,c) || isCross(t.c,t.a,c) )
		return true;
	else
		return false;
}

char judgeRel(const Triangle &t, const Circle &c){
	if( Contains( t,c ) )
		return 'a';
	if( IsContained( t,c ) )
		return 'b';
	if( isCross( t,c ) )
		return 'c';
	else
		return 'd';
}

int main()
{
	while(true){
		Triangle t;
		Circle c;

		cin >> t.a.x >> t.a.y;
		if( cin.eof() )
			break;
		if( t.a.x == 0 && t.a.y == 0 )
			break;
		cin >> t.b.x >> t.b.y >> t.c.x >> t.c.y >> c.c.x >> c.c.y >> c.r;
		cout << judgeRel( t, c ) << endl;
	}
	return 0;
}

Measured memory_bytes: 0