#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> l_l;
typedef pair<int, int> i_i;
template<class T>
inline bool chmax(T &a, T b) {
    if(a < b) {
        a = b;
        return true;
    }
    return false;
}

template<class T>
inline bool chmin(T &a, T b) {
    if(a > b) {
        a = b;
        return true;
    }
    return false;
}

const long double EPS = 1e-10;
const long long INF = 1e18;
const long double PI = acos(-1.0L);
//const ll mod = 1000000007;
int N, M, R;
vector<ll> Sx(N), Sy(N), Sz(N), Sr(N);
vector<double> Tx(M), Ty(M), Tz(M), Tb(M);
ll Ex, Ey, Ez;

double g(int c, int p, double t) {
    double x = Tx[p] * t + Ex * (1-t);
    double y = Ty[p] * t + Ey * (1-t);
    double z = Tz[p] * t + Ez * (1-t);
    double dx = x - Sx[c];
    double dy = y - Sy[c];
    double dz = z - Sz[c];
    double ret = sqrt(dx*dx+dy*dy+dz*dz);
    //cerr << c << " " << p << " " << t << " " << ret << endl;
    return ret;
}

double eps = 1e-9;

bool f(int c, int p) {
    double ok = 1;
    double ng = 0;
    for(int _ = 0; _ <= 100; _++) {
        double l = (2*ng+ok)/3;
        double r = (2*ok+ng)/3;
        if(g(c, p, l) > g(c, p, r)) ng = l;
        else ok = r;
    }
    bool a = (g(c, p, 0) <= (Sr[c] + eps));
    bool b = (g(c, p, 1) <= (Sr[c] + eps));
    bool d = g(c, p, ok) <= (Sr[c] + eps);
    /*
    if(c == 3) {
        cerr << c << " " << p << " " << ok << " " << a << " " << b << " " << d << endl;
        cerr << g(c, p, ok) << endl;
        cerr << g(c, p, 0) << endl;
        cerr << g(c, p, 1) << endl;
        cerr << Sr[c] << endl;
    }
    */
    return a != b or b != d;
}

bool used[1<<15][2005];

void solve() {
    for(int i = 0; i < 15; i++) {
        for(int j = 0; j < 2000; j++) {
            used[i][j] = false;
        }
    }
    Sx.resize(N);
    Sy.resize(N);
    Sz.resize(N);
    Sr.resize(N);
    Tx.resize(M);
    Ty.resize(M);
    Tz.resize(M);
    Tb.resize(M);
    for(int i = 0; i < N; i++) cin >> Sx[i] >> Sy[i] >> Sz[i] >> Sr[i];
    for(int i = 0; i < M; i++) {
        cin >> Tx[i] >> Ty[i] >> Tz[i] >> Tb[i];
    }
    cin >> Ex >> Ey >> Ez;
    for(int i = 0; i < M; i++) {
        double dx = Tx[i] - Ex;
        double dy = Ty[i] - Ey;
        double dz = Tz[i] - Ez;
        Tb[i] /= dx*dx+dy*dy+dz*dz;
    }
    vector<vector<int>> cross(M);
    for(int i = 0; i < M; i++) {
        for(int j = 0; j < N; j++) {
            if(f(j, i)) cross[i].push_back(j);
        }
    }
    /*
    for(int i = 0; i < M; i++) {
        cerr << "---" << i << "---" << endl;
        for(auto tmp : cross[i]) cerr << tmp << " ";
        cerr << endl;
    }
    */
    double ans = 0;
    for(int bits = 1; bits < (1 << M); bits++) {
        double sum = 0;
        for(int i = 0; i < M; i++) {
            if(bits & (1 << i)) {
                sum += Tb[i];
            }
        }
        int bit = 0;
        while(!(bits & (1 << bit))) bit++;
        for(int j = 0; j < N; j++) {
            used[bits][j] = used[bits^(1<<bit)][j];
        }
        for(auto tmp : cross[bit]) used[bits][tmp] = true;
        int num = 0;
        for(int i = 0; i < N; i++) {
            if(used[bits][i]) num++;
        }
        if(num <= R) chmax(ans, sum);
    }
    cout << fixed << setprecision(30) << ans << endl;
}

int main() {
    //cout.precision(10);
    cin.tie(0);
    ios::sync_with_stdio(false);
    while(cin >> N >> M >> R) {
        if(N == 0) break;
        solve();
    }
    return 0;
}
