#include <cstdio>
#include <set>
#include <cmath>
using namespace std;
struct Point
{
    double x;
    double y;
    double z;
    void read()
    {
        scanf("%lf %lf %lf",&x,&y,&z);
    }
    Point(double x=0,double y=0,double z=0):x(x),y(y),z(z){}
    Point operator +(const Point &ano)
    {
        return Point(x+ano.x,y+ano.y,z+ano.z);
    }
    Point operator -(const Point &ano)
    {
        return Point(x-ano.x,y-ano.y,z-ano.z);
    }
    Point operator *(double p)
    {
        return Point(x*p,y*p,z*p);
    }
    Point operator /(double p)
    {
        return Point(x/p,y/p,z/p);
    }
    void print()
    {
        printf("%f %f %f\n",x,y,z);
    }
}E;
struct S
{
    double x;
    double y;
    double z;
    double r;
    void read()
    {
        scanf("%lf %lf %lf %lf",&x,&y,&z,&r);
    }
    Point get()
    {
        return Point(x,y,z);
    }
}s[2100];
typedef Point Vector;
struct T
{
    double x;
    double y;
    double z;
    double b;
    void read()
    {
        scanf("%lf %lf %lf %lf",&x,&y,&z,&b);
    }
    Point get()
    {
        return Point(x,y,z);
    }
}t[20];
Vector Cross(Vector a,Vector b)
{
    return Vector(a.y*b.z - a.z*b.y,a.z*b.x -a.x * b.z,a.x*b.y-a.y*b.x);
}
const double eps=1e-3;
double Dot(Vector a,Vector b)
{
    return a.x*b.x + a.y*b.y +a.z *b.z;
}
double Length(Vector a)
{
    return sqrt(Dot(a,a));
}
double distanceToLine(Point p,Point a,Point b)
{
    Vector v1=b-a;
    Vector v2=p-a;
    return Length(Cross(v1,v2))/Length(v1);
}
int dcmp(double p)
{
    if(fabs(p)<eps)
    return 0;
    return p<0?-1:1;
}
bool Intersect(Point a,Point b,S s)
{
    int a1=dcmp(Length(a-s.get())-s.r);
    int a2=dcmp(Length(b-s.get())-s.r);
    if(a1 * a2<0)
        return true;
    if(a1<=0 && a2<=0)
        return false;
    double dis = distanceToLine(s.get(),a,b);
    if(dcmp(dis-s.r)>=0)
    return false;
    double d1=Length(b-s.get());
    double d2=Length(a-s.get());
    double x1=d1*d1-dis*dis;
    double x2=d2*d2-dis*dis;
    x1=sqrt(x1);
    x2=sqrt(x2);
    if(dcmp(x1+x2-Length(b-a))==0)
    return true;
    if(dcmp(fabs(x1-x2)-Length(b-a))==0)
    return false;
    1/0;
}
set<int> p[3000];
int main()
{
    int n,m,r;
    while(~scanf("%d %d %d",&n,&m,&r))
    {
        if(n+m+r==0)
        break;
        for(int i=0;i<n;i++)
        p[i].clear();
        for(int i=0;i<n;i++)
        s[i].read();
        for(int i=0;i<m;i++)
        t[i].read();
        E.read();
        for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
        {
            if(Intersect(t[j].get(),E,s[i]))
            p[i].insert(j);
        }
        double ans=0;
        for(int i=0;i<(1<<m);i++)
        {
            double sum=0;
            for(int j=0;j<m;j++)
            if(i&(1<<j))
            sum+=t[j].b/(Dot(t[j].get()-E,t[j].get()-E));
            if(sum<ans)
            continue;
            int t=0;
            for(int k=0;k<n;k++)
            for(int j=0;j<m;j++)
            {
                if(i&(1<<j) && p[k].count(j))
                {
                    t++;
                    break;
                }
            }
            if(t>r)
                    continue;
            if(sum>ans)
            ans=sum;
        }
        printf("%lf\n",ans);
    }
    return 0;
}

Measured memory_bytes: 1772