#include<bits/stdc++.h>
typedef long long int ll;
typedef unsigned long long int ull;
#define BIG_NUM 2000000000
#define HUGE_NUM 99999999999999999
#define MOD 1000000007
#define EPS 0.000000001
using namespace std;


#define NUM 105

struct Point{
	Point(double arg_x,double arg_y,double arg_z){
		x = arg_x;
		y = arg_y;
		z = arg_z;
	}

	Point(){
		x = y = z = 0.0;
	}

	Point operator + (Point p){ return Point(x+p.x,y+p.y,z+p.z); }
	Point operator - (Point p){ return Point(x-p.x,y-p.y,z-p.z);}
	Point operator * (double a){ return Point(a*x,a*y,a*z); }
	Point operator / (double a){ return Point(x/a,y/a,z/a); }

	double abs(){ return sqrt(norm()); }
	double norm(){ return x*x + y*y + z*z; }

	bool operator == (const Point &p) const{
		return fabs(x-p.x) < EPS && fabs(y-p.y) < EPS && fabs(z-p.z) < EPS;
	}
	double x,y,z;
};

typedef Point Vector;

struct LINE{
	LINE(Point arg_p1,Point arg_p2){
		p1 = arg_p1;
		p2 = arg_p2;
	}
	LINE(){

	}
	Point p1,p2;
};

struct Sphere{
	Point center;
	double r;
};

int N;
Sphere info[NUM];

double norm(Vector a){
	return a.x*a.x+a.y*a.y+a.z*a.z;
}

double abs(Vector a){
	return sqrt(norm(a));
}

double abs(LINE a){
	return abs(a.p1-a.p2);
}

double dot(Vector a,Vector b){
    return a.x*b.x + a.y*b.y+a.z*b.z;
}

Point cross(Vector a,Vector b){
	return Point(a.y*b.z-a.z*b.y,a.z*b.x-a.x*b.z,a.x*b.y-a.y*b.x);
}

Point projection(LINE &line,Point &point) {
    double t = dot(point-line.p1, line.p1-line.p2)/norm(line.p1-line.p2);
    return line.p1+(line.p1-line.p2)*t;
}

Point reflection(LINE &line,Point &point){
	return point+(projection(line,point)-point)*2.0;
}

bool intersect(Sphere &sphere, LINE &line){
    if(abs(line.p2-sphere.center) < sphere.r-EPS){
    	return true;
    }
    Point point = projection(line, sphere.center);
    return abs(point-line.p1)+abs(point-line.p2)-abs(line) < EPS and abs(point-sphere.center)< sphere.r-EPS;
}

Point cross_point(Sphere &sphere,LINE &line){
    Point point = projection(line, sphere.center);
    double d = sqrt(sphere.r * sphere.r-norm(point-sphere.center));
    return point+(line.p1-line.p2)/abs(line)*d;
}

void func(){

	Point current,tmp,calc;

	current.x = 0;
	current.y = 0;
	current.z = 0;

	Vector V;
	scanf("%lf %lf %lf",&V.x,&V.y,&V.z);

	for(int i = 0; i < N; i++){

		scanf("%lf %lf %lf %lf",&info[i].center.x,&info[i].center.y,&info[i].center.z,&info[i].r);
	}

	LINE line,tmp_line;

	int index = -1,next_index;

	line.p1 = current;
	line.p2 = current+(V/abs(V))*1000;

	while(true){

		next_index = -1;

		for(int i = 0; i < N; i++){
			if(i == index)continue;

			if(!intersect(info[i],line))continue;

			tmp = cross_point(info[i],line);
			line.p2 = tmp;
			next_index = i;
		}
		if(next_index == -1){
			break;
		}
		tmp_line.p1 = info[next_index].center;
		tmp_line.p2 = tmp;
		calc = reflection(tmp_line,current);
		current = tmp;
		V = calc-tmp;
		line.p1 = current;
		line.p2 = current+(V/abs(V))*1000;
		index = next_index;
	}

	printf("%.10lf %.10lf %.10lf\n",current.x,current.y,current.z);
}

int main(){

	while(true){
		scanf("%d",&N);
		if(N == 0)break;

		func();
	}

	return 0;
}

