#include<iostream>
#include<cstring>
#include<deque>
#include<set>
#define x first
#define y second
#define PII pair<int,int>
using namespace std;
const int N=11,M=400,P=1<<10;
int dist[N*N][P],st[N*N][M],h[N*N],e[M],w[M],ne[M],idx,n,m,p,k;
set<PII>edges;int cnt;int g[N][N];
int key[N*N];
void add(int a,int b,int c){
ne[idx]=h[a],e[idx]=b,w[idx]=c,h[a]=idx++;
}
void build(){
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int u=0;u<4;u++){
int x=i+dx[u],y=j+dy[u];
if(x<=0||x>n||y<=0||y>m)continue;
int b=g[x][y],a=g[i][j];
if(edges.count({a,b})==0)add(a,b,0);
}
}
int bfs()
{
memset(dist,0x3f,sizeof dist);
dist[1][0]=0;
deque<PII>q;
q.push_back({1,0});
while(q.size()){
auto t=q.front();
q.pop_front();
if(st[t.x][t.y])continue;
st[t.x][t.y]=true;
if(t.x==n*m)return dist[t.x][t.y];
if(key[t.x]){
int state=t.y|key[t.x];
if(dist[t.x][state]>dist[t.x][t.y]){
dist[t.x][state]=dist[t.x][t.y];
q.push_front({t.x,state});
}
}
for(int i=h[t.x];i!=-1;i=ne[i]){
int j=e[i];
if(w[i]&&!(t.y>>(w[i]-1)&1))continue;
if(dist[j][t.y]>dist[t.x][t.y]+1)
{
dist[j][t.y]=dist[t.x][t.y]+1;
q.push_back({j,t.y});
}
}
}
return -1;
}
int main(){
memset(h,-1,sizeof h);
cin>>n>>m>>p>>k;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
g[i][j]=++cnt;
}
while(k--){
int a,b,c;
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2>>c;
a=g[x1][y1],b=g[x2][y2];
if(c){
add(a,b,c);
add(b,a,c);
}
edges.insert({a,b});
edges.insert({b,a});
}
build();
int s;
cin>>s;
while(s--){
int a,b,c;
cin>>a>>b>>c;
key[g[a][b]]|=1<<(c-1);
}
cout<<bfs()<<endl;
return 0;
}