#include <iostream>
#include <cmath>

using namespace std;

#define EPS 1e-7

class Point{
public:
  double x,y;
  Point(double x = 0.0,double y = 0.0) : x(x),y(y) {}
  Point operator + (Point p){ return Point(x+p.x, y+p.y); }
  Point operator - (Point p){ return Point(x-p.x, y-p.y); }
  Point operator * (double a){ return Point(x*a, y*a); }
  Point operator / (double a){ return Point(x/a, y/a); }
  double abs(){ return sqrt(norm()); }
  double norm(){ return x*x + y*y; }
};

typedef Point Vector;
double dot(Vector a,Vector b){
  return a.x*b.x + a.y*b.y;
}
double cross(Vector a,Vector b){
  return a.x*b.y - a.y*b.x;
}

class Segment{
public:
  Vector t,s;
  Segment(Vector t,Vector s) : t(t),s(s) {}
  Point projection(Point &p){
    Vector b = s - t;
    double d = dot(p-t,b) / b.norm();
    return t + b*d;
  }
};

class Circle{
public:
  double x,y,r;
  Circle(double x = 0.0,double y = 0.0,double r = 0.0) : x(x),y(y),r(r) {}
};

Point point[3];
Circle ci;

int ccw(Point p0,Point p1,Point p2){
  Vector a = p1 - p0;
  Vector b = p2 - p0;
  if(cross(a,b) > EPS) return 1;
  if(cross(a,b) < -EPS) return -1;
  if(dot(a,b) < -EPS) return 2;
  if(a.norm() < b.norm()) return -2;
  return 0;
}

bool check(){
  Point cp = Point(ci.x,ci.y);
  int c1 = ccw(point[0],point[1],cp);
  int c2 = ccw(point[1],point[2],cp);
  int c3 = ccw(point[2],point[0],cp);
 
  if(c1 == c2 && c2 == c3) return true;
  return false;
}

typedef Segment Line;
double getDistanceLP(Line l,Point p){
  return abs(cross(l.s-l.t,p-l.t)/(l.s-l.t).abs());
}

double getDistanceSP(Segment seg,Point p){
  if(dot(seg.s-seg.t,p-seg.t) < 0.0) return (p-seg.t).abs();
  if(dot(seg.t-seg.s,p-seg.s) < 0.0) return (p-seg.s).abs(); 
  return getDistanceLP(seg,p);
}

int getStateCS(Circle c,Segment seg){
  Point cp = Point(c.x,c.y);
  Point p = seg.projection(cp);
  Point pp = p - cp;
  Vector a = seg.t - cp;
  Vector b = seg.s - cp;
  if(check() && a.abs() > c.r && b.abs() > c.r){
    if(pp.abs()+EPS > c.r && ccw(seg.t,seg.s,p)==0){
      return 1;
    }
  }else if(a.abs() < c.r && b.abs() < c.r){
    if(pp.abs()-EPS < c.r && ccw(seg.t,seg.s,p)==0){
      return 2;
    }
  }
  return 3;
}

bool isCross(){
  Point cp = Point(ci.x,ci.y);
  for(int i = 0 ; i < 3 ; i++){
    Point p = point[i];
    Point diff = p - cp;
    if(diff.abs() == ci.r) return true;
  }
  Segment seg[3] = {
    Segment(point[0],point[1]),
    Segment(point[1],point[2]),
    Segment(point[2],point[0])
  };
  
  for(int i = 0 ; i < 3 ; i++){
    if(getDistanceSP(seg[i],cp) < ci.r){
      return true;
    }
  }

  for(int i = 0 ; i < 3 ; i++){
    Segment ns = seg[i];
    Point p1 = ns.t, p2 = ns.s;
    if(p1.abs() < ci.r && p2.abs() > ci.r) return true;
    if(p1.abs() > ci.r && p2.abs() < ci.r) return true;
  }

  return false;
}

void judge(){
  Segment seg[3] = {
    Segment(point[0],point[1]),
    Segment(point[1],point[2]),
    Segment(point[2],point[0])
  };

  int CinT = 0,TinC = 0;
  for(int i = 0 ; i < 3 ; i++){
    int N = getStateCS(ci,seg[i]);
    if(N == 1){
      CinT++;
    }else if(N == 2){
      TinC++;
    }
  }

  if(CinT == 3){
    cout << 'a' << endl;
  }else if(TinC == 3){
    cout << 'b' << endl;
  }else{
    if(isCross()){
      cout << 'c' << endl;
    }else{
      cout << 'd' << endl;
    }
  }
}

int main(){
  while(true){
    cin >> point[0].x >> point[0].y;
    if(!point[0].x && !point[0].y) break;
    for(int i = 0 ; i < 2 ; i++){
      cin >> point[i+1].x >> point[i+1].y;
    }
    cin >> ci.x >> ci.y >> ci.r;
    judge();
  }

  return 0;
}