#include <bits/stdc++.h>
#include <iostream>
using namespace std;
int n,m,k,d,x,y,num;
vector<vector<int>>a,b;
inline int bfs(vector<vector<int>>&maze,vector<vector<int>>&dis,vector<vector<int>>&a){
int n=maze.size()-2;
vector<vector<int>> vis(n+2, vector<int>(n+2,0));
queue<vector<int>> que;
for(int i=0;i<m;i++){
int x=a[i][0],y=a[i][1];que.push({x,y,0});vis[x][y]=1;
}
while(!que.empty()){
vector<int> temp=que.front();
que.pop();
int x1=temp[0],y1=temp[1],value=temp[2];
if(dis[x1][y1]!=INT_MAX&&dis[x1][y1]<value)continue;
dis[x1][y1]=value;
vector<pair<int,int>>directions={{1,0},{0,1},{-1,0},{0,-1}};
for(auto& dir:directions) {
int newX=x1+dir.first;
int newY=y1+dir.second;
if (newX>=1&&newX<=n&&newY>=1&&newY<=n&&maze[newX][newY]!=-1&&vis[newX][newY]==0){
vis[newX][newY]=1;
que.push({newX,newY,value+1});
}
}
}
return 0;
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m>>k>>d;
vector<vector<int>>maze(n+2,vector<int>(n+2,0));
vector<vector<int>>dis(n+2,vector<int>(n+2,INT_MAX));
for(int i=0;i<=n+1;i++){
maze[i][0]=-1;
maze[0][i]=-1;
maze[n+1][i]=-1;
maze[i][n+1]=-1;
}
for(int i=0;i<m;i++){
cin>>x>>y;
dis[x][y]=0;
maze[x][y]=1;
a.push_back({x,y});
}
int custnum[k];
for(int i=0;i<k;i++){
cin>>x>>y>>custnum[i];
b.push_back({x,y});
maze[x][y]=2;
}
for(int i=0;i<d;i++){
cin>>x>>y;
maze[x][y]=-1;
}
bfs(maze,dis,a);
long long sum=0;
for(int i=0;i<k;i++){
int x2=b[i][0],y2=b[i][1];
sum+=((long long)custnum[i]*dis[x2][y2]);
}
cout<<sum;
return 0;
}