#include<bits/stdc++.h>
using namespace std;
#define rep(i,s,t) for (int i=s;i<=t;i++)
#define pi acos(-1)
typedef long long LL;
typedef pair<int,int> PII;
typedef pair<double, double> PDD;
typedef pair<PII, PII> PPP;
typedef pair<PII, int> PPI;
typedef pair<int, double> PID;
#define repp(i,s,t) for (int i=s;i>=t;i--)
template<class T> T sqr(T x) {return x*x;}
#define debug(x) cerr<<#x"="<<(x)<<endl;
#define pb(x) push_back(x);
#define ori(x) x-'a'
const int maxn = 301;
const int maxm = 51;
int ind[maxm][maxm][maxm];
PII a[maxn], b[maxn];
int n,m,K,cnt;
int c[maxn];
double peri[maxm * maxm * maxm];
int mask[maxm * maxm * maxm];
int vis[maxm * maxm * maxm][1<<7];
double dis[maxm * maxm * maxm][1<<7];
vector<PID> g[maxm * maxm * maxm];
PII operator - (const PII &lhs, const PII &rhs)
{
	return PII(lhs.first - rhs.first, lhs.second - rhs.second);
}
double dist(int x, int y)
{
	double x1 = a[x].first - a[y].first;
	double y1 = a[x].second - a[y].second;
	return sqrt(x1*x1+y1*y1);
}
int sgn(double x)
{
	if (x < 0) return -1;
	if (x == 0) return 0;
	return 1;
}
double cp(PII x, PII y)
{
	return x.first*y.second - x.second*y.first;
}
int intri(int i, int j, int k, int l)
{
	return sgn(cp(a[j]-a[i], b[l]-a[i])) * sgn(cp(a[k]-a[i], b[l]-a[i])) < 0 
		&& sgn(cp(a[i]-a[j], b[l]-a[j])) * sgn(cp(a[k]-a[j], b[l]-a[j])) < 0
		&& sgn(cp(a[i]-a[k], b[l]-a[k])) * sgn(cp(a[j]-a[k], b[l]-a[k])) < 0;
}
int get_ind(int i, int j, int k)
{
	vector<int> v;
	v.push_back(i);
	v.push_back(j);
	v.push_back(k);
	sort(v.begin(), v.end());
	return ind[v[0]][v[1]][v[2]];
}
int main()
{
	scanf("%d%d%d",&n,&m,&K);
	rep(i,1,n) scanf("%d%d",&b[i].first, &b[i].second);
	rep(i,1,n)
	{
		scanf("%d",&c[i]);
		c[i]--;
	}
	
	rep(i,1,m) 
		scanf("%d%d",&a[i].first, &a[i].second);
	rep(i,1,m) rep(j,i+1,m) rep(k,j+1,m)
	if (cp(a[k]-a[i], a[j]-a[i]) != 0)
	{
		++cnt;
		peri[cnt] = dist(i,j) + dist(j,k) + dist(k,i);
		ind[i][j][k] = cnt;
		rep(l,1,n) if (intri(i,j,k,l)) mask[cnt] |= 1 << c[l];
	}
	rep(i,1,m) rep(j,i+1,m)
	{
		double L = dist(i,j);
		rep(k,1,m) if (cp(a[k] - a[i], a[j] - a[i]) != 0) 
		rep(l,1,m) if (!(k == l || cp(a[l] - a[i], a[j] - a[i]) == 0))
		{
			int u = get_ind(i,j,k);
			int v = get_ind(i,j,l);
			g[u].push_back(PID(v, L));
			g[v].push_back(PID(u, L));
		}
	}
	rep(i,1,cnt) rep(state,0,(1 << K)-1) dis[i][state] = 1e9;
	queue<PII> Q;
	rep(i,1,cnt) 
	{
		Q.push(PII(i, mask[i]));
		dis[i][mask[i]] = peri[i];
	}
	while (!Q.empty())
	{
		int u = Q.front().first;
		int msk = Q.front().second;
		Q.pop();
		vis[u][msk] = 0;
		for (int i = 0 ; i < g[u].size(); i++)
		{
			int v = g[u][i].first;
			int newmsk = msk | mask[v];
			if (dis[v][newmsk] > dis[u][msk] + peri[v] - 2 * g[u][i].second)
			{
				dis[v][newmsk] = dis[u][msk] + peri[v] - 2 * g[u][i].second;
				if (!vis[v][newmsk])
				{
					vis[v][newmsk] = 1;
					Q.push(PII(v, newmsk));
				}
			}
		}
	}
	double ans = 1e9;
	rep(i,1,cnt) ans = min(ans, dis[i][(1<<K) - 1]);
	if (ans == 1e9) puts("-1");
	else printf("%.10lf\n", ans);
}

