#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <unordered_map>
#include <unordered_set>

#include <functional>
#include <cassert>

typedef long long ll;
using namespace std;

#define debug(x) cerr << #x << " = " << (x) << endl;


#define mod 1000000007 //1e9+7(prime number)
#define INF 1000000000 //1e9
#define LLINF 2000000000000000000LL //2e18
#define SIZE 1010

#define double long double

/* Point (x,y)*/
struct P{
  typedef double Type;
  
  Type x,y;
  
  P(Type X,Type Y){
    x = X;
    y = Y;
  }
  
  P rotate(double theta){
    return P(y*cos(theta)-x*sin(theta),y*sin(theta)+x*cos(theta));
  }
  
  bool operator< (const P &B) const{
    return x==B.x ? y < B.y : x < B.x;
  }
  
};

/* Line ax+bx+c=0 */
struct Line{
  typedef double Type;
  
  Type a,b,c;
  
  Line(Type A,Type B,Type C){
    a = A;
    b = B;
    c = C;
  }
  
  //2???(x_1,y_1),(x_2,y_2)???????????´???
  Line(Type x_1,Type y_1,Type x_2,Type y_2){
    a = y_1-y_2;
    b = x_2-x_1;
    c = y_1*(x_1-x_2)-x_1*(y_1-y_2);
  }
  
  /*??\??????Type???????????????double*/
  
  // y??§?¨???????x??§?¨??????????
  double x(double y){
    return -(double)(b*y+c)/a;
  }
  
  // x??§?¨???????y??§?¨??????????
  double y(double x){
    return -(double)(a*x+c)/b;
  }
  
};


int solve(){
  int n,m;
  int wx[SIZE], wy[SIZE], r[SIZE];
  const double eps = 1e-10;
  
  scanf("%d",&n);

  if(n == 0) return false;
  
  for(int i=0;i<n;i++){
    scanf("%d%d%d",wx+i, wy+i,r+i);
  }

  scanf("%d",&m);
  
  for(int i=0;i<m;i++){
    int tx,ty,sx,sy;
    bool flag = false;
    
    scanf("%d%d%d%d",&tx,&ty,&sx,&sy);

    Line l(tx,ty,sx,sy);

    for(int j=0;j<n;j++){

      double dist = abs(l.a * wx[j] + l.b * wy[j] + l.c)/sqrt(l.a*l.a + l.b*l.b);
      int dist1 = (wx[j]-tx)*(wx[j]-tx) + (wy[j]-ty)*(wy[j]-ty);
      int dist2 = (wx[j]-sx)*(wx[j]-sx) + (wy[j]-sy)*(wy[j]-sy);

      if(dist1 <= r[j]*r[j] && dist2 <= r[j]*r[j]) continue; //??±????????´
      if(dist > r[j] + eps) continue;

      if(dist1 <= r[j]*r[j] || dist2 <= r[j]*r[j]){ //???????????´
        flag = true;
      }
      
      //y = ax+b
      double a = -1/l.a;
      double b = wy[j] - a*wx[j];
      /*
      aqx = qy - qb
      px = -qy - r

      (aq + p)x = - (qb + r)
      */
      double cx = - (l.c + b * l.b)/(l.a + a * l.b);
      
      if(min(tx,sx) <= cx-eps && cx+eps <= max(tx,sx)){
        flag = true;
      }
      
    }

    if(flag)
      puts("Safe");
    else
      puts("Danger");
  }
  
  return true;
}

int main(){

  while(solve());

}