#include <iostream> #include <stdio.h> #include <queue> #include <algorithm> #define MAXN 5000 #define INF 99999999 using namespace std; struct point{ int x,y; int step; }; queue<point> Q; int n,m,k,d; int map[MAXN][MAXN]; int times[MAXN][MAXN]; int num[MAXN][MAXN]; int queue_m[MAXN*MAXN][2]; int queue_k[MAXN*MAXN][2]; bool flag[MAXN][MAXN]; int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}}; int ax,ay; void bfs(point s){ memset(flag,0,sizeof(flag)); int i; Q.push(s); point hd; while(!Q.empty()){ hd=Q.front(); Q.pop(); for(i=0;i<4;i++){ int x=hd.x+dir[i][0]; int y=hd.y+dir[i][1]; if (x>=1 && x<=n && y>=1 && y<=n && map[x][y]!=3 && flag[x][y]==0){ point t; t.x=x; t.y=y; t.step=hd.step+1; if(map[t.x][t.y]==2){ if(t.step<times[t.x][t.y]){ times[t.x][t.y]=t.step; } } Q.push(t); flag[x][y]=1; } } } } int main(){ int a,b,c; while(scanf("%d%d%d%d",&n,&m,&k,&d)!=EOF){ memset(map,0,sizeof(map)); memset(num,0,sizeof(num)); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ times[i][j]=INF; } } for(int i=0;i<m;i++){ scanf("%d%d",&a,&b); map[a][b]=1; queue_m[i][0]=a; queue_m[i][1]=b; } for(int i=0;i<k;i++){ scanf("%d%d%d",&a,&b,&c); map[a][b]=2; num[a][b]=c; queue_k[i][0]=a; queue_k[i][1]=b; } for(int i=0;i<d;i++){ scanf("%d%d",&a,&b); map[a][b]=3; } for(int i=0;i<m;i++){ point start; start.x=queue_m[i][0]; start.y=queue_m[i][1]; start.step=0; bfs(start); } int sum=0; for(int i=0;i<k;i++){ sum+=times[queue_k[i][0]][queue_k[i][1]]*num[queue_k[i][0]][queue_k[i][1]]; } printf("%d\n",sum); } return 0; }