1 #include<iostream>
2 #include<cstdio>
3 #include<algorithm>
4 #include<vector>
5 #include<cstdlib>
6 #include<cmath>
7 #include<cstring>
8 using namespace std;
9 #define maxn 110
10 #define ZT ((1<<12)+1)
11 #define llg long long
12 #define maxlen 100000
13 #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
14 #define inf (llg)1e16
15 llg n,m,to[5][2],dis[maxn][ZT],yaoshi[maxn],bj[maxn][ZT];
16 llg p,k,S,head,tail;
17
18 llg num_(llg x,llg y){return (x-1)*m+y;}
19
20 struct node
21 {
22 llg p1,p2,ty;
23 }e[151];
24
25 struct data
26 {
27 llg po,set;
28 }dl[maxlen+5];
29
30 vector<llg>a[maxn];
31
32 void init()
33 {
34 to[1][1]=1,to[2][1]=-1,to[3][0]=1,to[4][0]=-1;
35 cin>>n>>m>>p>>k;
36 p++;
37 llg x1,y1,x2,y2,z;
38 for (llg i=1;i<=k;i++)
39 {
40 scanf("%lld%lld%lld%lld%lld",&x1,&y1,&x2,&y2,&z);
41 llg x=num_(x1,y1); llg y=num_(x2,y2);
42 if (x>y) swap(x,y);
43 e[i].p1=x,e[i].p2=y,e[i].ty=z;
44 }
45 for (llg i=1;i<=n;i++)
46 for (llg j=1;j<=m;j++)
47 {
48 for (llg w=1;w<=4;w++)
49 if (i+to[w][0]>=1 && i+to[w][0]<=n && j+to[w][1]>=1 && j+to[w][1]<=m)
50 a[num_(i,j)].push_back(num_(i+to[w][0],j+to[w][1]));
51 }
52 cin>>S;
53 for (llg i=1;i<=S;i++)
54 {
55 scanf("%lld%lld%lld",&x1,&y1,&z);
56 yaoshi[num_(x1,y1)]|=(1<<z);
57 }
58 n*=m;
59 for (llg i=1;i<=n;i++)
60 for (llg j=0;j<(1<<p);j++) dis[i][j]=inf;
61 head=0,tail=1,dl[1].po=1,dl[1].set=0;
62 dis[1][0]=0;
63 }
64
65 llg find(llg x,llg y)
66 {
67 for (llg i=1;i<=k;i++)
68 if ((e[i].p1==x && e[i].p2==y) || (e[i].p1==y && e[i].p2==x)) return e[i].ty;
69 return -1;
70 }
71
72 void spfa()
73 {
74 llg x,v,se,w;
75 do
76 {
77 head%=maxlen; head++;
78 x=dl[head].po,se=dl[head].set,w=a[x].size();
79 bj[x][se]=0;
80 for (llg i=0;i<w;i++)
81 {
82 v=a[x][i];
83 llg color=find(x,v);
84 //if (color==0) continue;
85 if (yaoshi[x]!=0)
86 {
87 llg nse=se|yaoshi[x];
88 if (dis[x][nse]>dis[x][se])
89 {
90 dis[x][nse]=dis[x][se];
91 if (!bj[x][nse])
92 {
93 bj[x][nse]=1;
94 tail%=maxlen;
95 dl[++tail].po=x,dl[tail].set=nse;
96 }
97 }
98 }
99
100 if (color==0) continue;
101 if (color>0)
102 {
103 if ((se&(1<<color))==0) continue;
104 }
105 if (dis[v][se]>dis[x][se]+1)
106 {
107 dis[v][se]=dis[x][se]+1;
108 if (!bj[v][se])
109 {
110 bj[v][se]=1;
111 tail%=maxlen;
112 dl[++tail].po=v,dl[tail].set=se;
113 }
114 }
115 if (yaoshi[x]!=0)
116 {
117 llg nse=se|yaoshi[x];
118 if (dis[v][nse]>dis[x][se]+1)
119 {
120 dis[v][nse]=dis[x][se]+1;
121 if (!bj[v][nse])
122 {
123 bj[v][nse]=1;
124 tail%=maxlen;
125 dl[++tail].po=v,dl[tail].set=nse;
126 }
127 }
128 }
129 }
130 }while (head!=tail);
131 }
132
133 int main()
134 {
135 yyj("save");
136 init();
137 spfa();
138 llg ans=inf;
139 for (llg i=0;i<(1<<p);i++) ans=min(ans,dis[n][i]);
140 if (ans==inf) cout<<-1;else
141 cout<<ans<<endl;
142 return 0;
143 }