#include<iostream>
#include<string>
#include<cstdio>
#include<vector>
#include<cmath>
#include<algorithm>
#include<functional>
#include<iomanip>
#include<queue>
#include<ciso646>
#include<random>
#include<map>
#include<set>
#include<complex>
#include<bitset>
#include<stack>
#include<unordered_map>
#include<utility>
using namespace std;
typedef long long ll;
typedef unsigned long long ul;
typedef unsigned int ui;
typedef long double ld;
typedef pair<int, int> P;
typedef pair<ll, ll> LP;
typedef pair<ld, ld> LDP;
typedef complex<ld> Point;
const ll mod = 1000000007;
const ld INF = 1e+30;
const ld eps = 1e-8;
const ld pi = acos(-1.0);
#define stop char nyaa;cin>>nyaa;
#define rep(i,n) for(int i=0;i<n;i++)
#define per(i,n) for(int i=n-1;i>=0;i--)
#define Rep(i,sta,n) for(int i=sta;i<n;i++)
#define rep1(i,n) for(int i=1;i<=n;i++)
#define per1(i,n) for(int i=n;i>=1;i--)
#define Rep1(i,sta,n) for(int i=sta;i<=n;i++)

struct point {
	ld x, y, z;
};
struct vect {
	ld x, y, z;
};
struct circle {
	point p; ld r;
};
struct light {
	point p; ld c;
};
ld dist(point a,vect v,point c) {
	ld dx = c.x - a.x, dy = c.y - a.y, dz = c.z - a.z;
	ld t = (dx * v.x + dy * v.y + dz * v.z) / (pow(v.x, 2) + pow(v.y, 2) + pow(v.z, 2));
	ld hx = a.x + t * v.x, hy = a.y + t * v.y, hz = a.z + t * v.z;
	ld ret = pow(c.x - hx, 2) + pow(c.y - hy, 2) + pow(c.z - hz, 2);
	return sqrt(ret);
}
ld dist(point a, point b) {
	ld ret = pow(b.x - a.x, 2) + pow(b.y - a.y, 2) + pow(b.z - a.z, 2);
	return sqrt(ret);
}
bool eq(ld a, ld b) {
	return abs(a-b) < eps;
}
bool isis_pc(point a, vect v, circle x) {
	point c = x.p;
	ld dx = c.x - a.x, dy = c.y - a.y, dz = c.z - a.z;
	ld t = (dx * v.x + dy * v.y + dz * v.z) / (pow(v.x, 2) + pow(v.y, 2) + pow(v.z, 2));
	ld hx = a.x + t * v.x, hy = a.y + t * v.y, hz = a.z + t * v.z;
	ld r = pow(c.x - hx, 2) + pow(c.y - hy, 2) + pow(c.z - hz, 2);
	r = sqrt(r);
	bool f = x.r-eps > dist(a, x.p);
	bool g = x.r-eps > dist({ a.x + v.x,a.y + v.y,a.z + v.z }, x.p);
	//if (f != g)cout << "?? ";
	//cout << t << endl;
	if (g != f)return true;
	if (t > -eps && t < 1 + eps) {
		bool fg = x.r-eps > r;
		return f != fg;
	}
	else {
		return false;
	}
}
bitset<2000> b[15];
bitset<2000> bs;
ld bri[15];
void solve() {
	vector<ld> out;
	cout << fixed << setprecision(6);
	int n, m, r;
	while (cin >> n >> m >> r, n||m||r) {
		vector<circle> v(n);
		rep(i, n) {
			cin >> v[i].p.x >> v[i].p.y >> v[i].p.z >> v[i].r;
		}
		vector<light> t(m);
		rep(i, m) {
			cin >> t[i].p.x >> t[i].p.y >> t[i].p.z >> t[i].c;
		}
		point e; cin >> e.x >> e.y >> e.z;
		rep(i, m) {
			bri[i] = t[i].c / (pow(t[i].p.x - e.x, 2) + pow(t[i].p.y - e.y, 2) + pow(t[i].p.z - e.z, 2));
		}
		rep(i, m) {
			vect vec = { e.x - t[i].p.x,e.y - t[i].p.y,e.z - t[i].p.z };
			rep(j, n) {
				
				//cout << i << " " << j<<" ";
				if (isis_pc(t[i].p, vec, v[j])) {
					b[i][j] = 1;
				}
				else {
					b[i][j] = 0;
				}
			}
		}
		/*rep(i, m) {
			rep(j, n) {
				cout << b[i][j];
			}
			cout << endl;
		}*/
		ld ans = 0;
		rep(i, (1 << m)) {
			rep(j, n)bs[j] = 0;
			ld sum = 0;
			rep(j, m) {
				if (i&(1 << j)) {
					sum += bri[j];
					bs |= b[j];
				}
			}
			int cnt = 0;
			rep(j, n) {
				if(bs[j])cnt++;
			}
			if (cnt <= r) {
				ans = max(ans, sum);
			}
		}
		cout << ans << endl;
		//out.push_back(ans);
	}
	/*rep(i, out.size()) {
		cout << out[i] << endl;
	}*/
}
int main() {
	cin.tie(0);
	ios::sync_with_stdio(false);
	solve();
	//stop
	return 0;
}


Measured memory_bytes: 3396