#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const int N = 55;
const double eps = 1e-7;
const int SIZE = N*N;
int n, m , k;
int L[SIZE], R[SIZE], U[SIZE], D[SIZE], Sum[SIZE], Row[SIZE], Col[SIZE];
int lenx, id, deep, anslen;
bool OK;
inline int rd() {
char ch;
while( ch = getchar(), ch == ' ' || ch == '\n');
int d = ch - '0';
while( ch = getchar(), ch <= '9' && ch >= '0' ) d = d* 10 + ch - '0';
return d;
}
struct point {
int x, y;
void read() {
x = rd(); y = rd();
}
} city[N], radar[N];
struct circle {
point o;
double r;
circle(){}
circle(point _o, double _r) {
o = _o;
r = _r;
}
bool incircle(point q) {
return 1.0*(o.x-q.x)*(o.x-q.x) + 1.0*(o.y-q.y)*(o.y-q.y) - r * r < eps;
}
} Radar[N];
void init() {
n = rd(); m = rd(); k = rd();
for(int i = 1; i <= n; i ++) city[i].read();
for(int i = 1; i <= m; i ++) Radar[i].o.read();
}
inline void pre(int cntcol) {
for(int i = 0; i <= cntcol; i ++) {
L[i] = i - 1;
R[i] = i + 1;
U[i] = D[i] = i;
Sum[i] = 0;
}
L[0] = cntcol; R[cntcol] = 0;
id = cntcol + 1;
}
inline void insert(int i, int *xx) {
for(int j = 0; j < lenx; j ++, id ++) {
int x = xx[j];
Row[id] = i;
Col[id] = x;
Sum[x] ++;
U[id] = x;
D[id] = D[x];
U[D[x]] = id;
D[x] = id;
if( j == 0 ) {
L[id] = R[id] = id;
} else {
L[id] = id - 1;
R[id] = id - j;
R[id-1] = id;
L[id-j] = id;
}
}
}
inline void remove(int &c) {
for(int i = D[c]; i != c ; i = D[i]) {
L[R[i]] = L[i];
R[L[i]] = R[i];
}
}
inline void resume(int &c) {
for(int i = U[c]; i != c ; i = U[i]) {
L[R[i]] = i;
R[L[i]] = i;
}
}
inline int Astar() {
int res = 0;
bool vis[N*N] = {false};
for(int i = R[0]; i != 0; i =R[i]) {
if( !vis[ i ] ) {
vis[ i ] = true;
res ++;
for(int j = D[i]; j != i; j = D[j]) {
for(int k = R[j]; k != j; k = R[k]) {
vis[ Col[k] ] = true;
}
}
}
}
return res;
}
void dfs(int dep) {
if( Astar() + dep > deep ) return ;
if(R[0] == 0) {
anslen = dep;
OK = true;
return;
}
int idx = R[0];
for(int i = R[0] ; i != 0 ; i = R[i]) {
if(Sum[i] < Sum[idx]) {
idx = i;
if( Sum[idx] <= 1 ) break;
}
}
for(int i = D[idx] ; i != idx; i = D[i]) {
remove(i);
for(int j = R[i] ; j != i ; j = R[j]) remove(j);
dfs( dep + 1 );
for(int j = L[i] ; j != i ; j = L[j]) resume(j);
resume(i);
if( OK ) return;
}
}
inline void build() {
int x[N];
for(int i = 1; i <= m; i ++) {
lenx = 0;
for(int j = 1; j <= n; j ++) {
if( Radar[i].incircle(city[j]) ) {
x[lenx++] = j;
}
}
insert(i, x);
}
}
bool check(double R) {
for(int i = 1; i <= m; i ++) Radar[i].r = R;
pre(n);
build();
deep = 0;
anslen = 0;
OK = false;
while( !OK ) {
if( deep > k ) break;
dfs(0);
deep ++;
}
return OK;
}
void solve() {
double left = 0, right = 1e29, mid;
while( right - left > eps) {
mid = (left + right) / 2;
if( check(mid) ) {
right = mid;
} else {
left = mid;
}
}
printf("%lf\n", left);
}
int main() {
int t;
scanf("%d", &t);
while( t -- ) {
init();
solve();
}
}