#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
#define chmin(X,Y) X=min(X,Y)
#define N 15
#define F 4
int m[N], f[N];
int g[N][N][N][N];
int ld[N][F][N][1<<N], gd[N][1<<N];
int c1[N], c2[N], sf, n;
int d1[N], d2[N], d3a[N][F], d3b[N][F], d4a[N][F][F], d4b[N][F][F], d4c[N][F][F][F], d4d[N][F][F];
int pat[N], u1[N], u2[N], u3[N];
bool ng;
int INF = 151587081;
void ltsp(int cr, int ct){
ld[cr][ct][ct][1<<ct] = 0;
int mm = m[cr];
for(int i = 0; i < 1<<mm; i++){
if(!(1&(i>>ct))) continue;
for(int j = 0; j < mm; j++){
if(ld[cr][ct][j][i]>=INF) continue;
for(int k = 0; k < mm; k++){
if(1&(i>>k)) continue;
chmin(ld[cr][ct][k][i|(1<<k)], ld[cr][ct][j][i]+g[cr][j][cr][k]);
}
}
}
}
void pre_calc(int cr){
if(f[cr] == m[cr]) return;
if(f[cr] == 1){
d1[cr] = m[cr]==1?0:INF;
ng = true;
} else if(f[cr] == 2){
d2[cr] = ld[cr][0][1][(1<<m[cr])-1];
} else if(f[cr] == 3){
for(int i = 0; i < 3; i++){
int j = (i+1)%3, k = (i+2)%3;
d3a[cr][i] = ld[cr][j][k][((1<<m[cr])-1)^(1<<i)];
d3b[cr][i] = ld[cr][j][k][((1<<m[cr])-1)];
}
} else {
for(int i = 0; i < 4; i++){
for(int j = i+1; j < 4; j++){
int k = 0;
while(k==i||k==j) k++;
int l = k+1;
while(l==i||l==j) l++;
d4b[cr][i][j] = d4b[cr][j][i] = ld[cr][i][j][((1<<m[cr])-1)^(1<<k)^(1<<l)];
d4c[cr][i][j][k] = d4c[cr][j][i][k] = ld[cr][i][j][((1<<m[cr])-1)^(1<<l)];
d4c[cr][i][j][l] = d4c[cr][j][i][l] = ld[cr][i][j][((1<<m[cr])-1)^(1<<k)];
d4d[cr][i][j] = d4d[cr][j][i] = ld[cr][i][j][((1<<m[cr])-1)];
for(int b = (1<<i)|(1<<j); b < 1<<m[cr]; b+=1<<4)
chmin(d4a[cr][i][j], ld[cr][i][j][b]+ld[cr][k][l][(1<<m[cr])-b-1]);
/*for(int b = 0; b < 1<<m[cr]; b++){
if(1&((i>>k)|(i>>l))) continue;
chmin(d4a[cr][i][j], ld[cr][i][j][b]+ld[cr][k][l][(1<<m[cr])-b]);
}*/
}
}
}
}
int gtsp(){
memset(gd, 9, sizeof(gd));
int start = u1[0];
if(f[0]==3) start = (start+1)%3;
//start = 0; // debug
gd[start][0] = 0;
for(int i = 0; i < 1<<sf; i++){
for(int j = 0; j < sf; j++){
if(gd[j][i]>=INF) continue;
int f1 = c1[j], f2 = c2[j];
for(int k = 0; k < sf; k++){
if((1&(i>>k))) continue;
int t1 = c1[k], t2 = c2[k];
int kk = k-t2;
int sz = f[t1];
int pt = pat[t1];
int r = gd[j][i]+g[f1][f2][t1][t2];
if(r>=INF) continue;
//if(f1==t1 && f[t1]!=m[t1]) continue; // debug
//cerr<<"t1: "<<t1<<" t2: "<<t2<<" sz: "<<sz<<" pt: "<<pt<<endl;
if(f[t1]==m[t1]){
chmin(gd[k][i|(1<<k)], r);
} else if(f[t1]==2){
int k2 = kk+1-t2;
chmin(gd[k2][i|(1<<k)|(1<<k2)], r);
} else if(f[t1]==3){
int k2 = kk+3-t2-u1[t1];
if(pt==0){
if(u1[t1]==t2){
chmin(gd[k][i|(1<<k)], r);
} else {
chmin(gd[k2][i|(1<<k)|(1<<k2)], r);
}
} else {
if(u1[t1]!=t2){
chmin(gd[k2][i|(1<<kk)|(1<<(kk+1))|(1<<(kk+2))], r);
}
}
} else {
int tt = -1;
if(t2==u1[t1]) tt = u2[t1];
else if(t2==u2[t1]) tt = u1[t1];
int k2 = kk+tt;
if(pt==0){
if(tt<0){
tt = 6-t2-u1[t1]-u2[t1];
k2 = kk+tt;
}
chmin(gd[k2][i|(1<<k)|(1<<k2)], r);
//cerr<<"a: "<<u1[t1]<<" b: "<<u2[t1]<<" c: "<<t2<<" d: "<<tt<<endl;
} else if(pt==1){
if(tt<0){
chmin(gd[k][i|(1<<k)], r);
} else {
chmin(gd[k2][i|(1<<k)|(1<<k2)], r);
}
} else if(pt==2){
if(tt>=0){
int k3 = kk+u3[t1];
chmin(gd[k2][i|(1<<k)|(1<<k2)|(1<<k3)], r);
} else if(t2!=u3[t1]){
chmin(gd[k][i|(1<<k)], r);
}
} else {
if(tt>=0){
chmin(gd[k2][i|(1<<kk)|(1<<(kk+1))|(1<<(kk+2))|(1<<(kk+3))], r);
}
}
}
}
}
}
int res = gd[start][(1<<sf)-1];
//if(res>=INF) return INF;
//cerr<<"initial: "<<res<<endl;
for(int i = 0; i < n; i++){
int res_old = res;
int pt = pat[i];
if(f[i]==m[i]) continue;
if(f[i]==2){
res += d2[i];
} else if(f[i]==3){
res += pt==0?d3a[i][u1[i]]:d3b[i][u1[i]];
} else {
res +=
pt==0 ? d4a[i][u1[i]][u2[i]] :
pt==1 ? d4b[i][u1[i]][u2[i]] :
pt==2 ? d4c[i][u1[i]][u2[i]][u3[i]] :
d4d[i][u1[i]][u2[i]] ;
}
cerr<<i<<" "<<f[i]<<": "<<" "<<pt<<" "<<u1[i]<<" "<<u2[i]<<" "<<u3[i]<<" "<<res-res_old<<endl;
}
cerr<<res<<endl;
return res;
}
void init(){
memset(g, 9, sizeof(g));
memset(ld, 9, sizeof(ld));
memset(d1, 9, sizeof(d1));
memset(d2, 9, sizeof(d2));
memset(d3a, 9, sizeof(d3a));
memset(d3b, 9, sizeof(d3b));
memset(d4a, 9, sizeof(d4a));
memset(d4b, 9, sizeof(d4b));
memset(d4c, 9, sizeof(d4c));
memset(d4d, 9, sizeof(d4d));
}
bool u4(int pos){
if(u2[pos]<3){
u2[pos]++;
return true;
}
if(u1[pos]<2){
u1[pos]++;
u2[pos] = u1[pos]+1;
return true;
}
u1[pos] = 0;
u2[pos] = 1;
pat[pos]++;
return false;
}
int main(){
init();
int K;
cin>>n>>K;
for(int i = 0; i < n; i++) cin>>m[i];
for(int i = 0; i < n; i++){
cin>>f[i];
sf += f[i];
}
if(n==1){
sf = m[0];
for(int i = m[0]-1; i >= 0; i--)
m[i] = f[i] = 1;
}
for(int i = 0; i < K; i++){
int a, b, c, d, e;
cin>>a>>b>>c>>d>>e;
a--; b--; c--; d--;
if(n==1) swap(a, b), swap(c, d);
g[a][b][c][d] = g[c][d][a][b] = e;
}
if(n==1 && sf==1){
cout<<0<<endl;
return 0;
}
for(int i = 0, cc1 = 0, cc2 = 0; i < sf; i++){
if(cc2>=f[cc1]){
cc1++;
cc2 = 0;
}
//cerr<<"c1: "<<cc1<<" c2: "<<cc2<<endl;
c1[i] = cc1;
c2[i] = cc2++;
}
for(int i = 0; i < n; i++){
for(int j = 0; j < f[i]; j++)
ltsp(i, j);
pre_calc(i);
}
if(ng){
cout<<-1<<endl;
return 0;
}
for(int i = 0; i < N; i++){
u2[i] = 1;
u3[i] = 2;
}
int res = INF;
for(;;){
chmin(res, gtsp());
//cerr<<"current answer: "<<res<<endl;
//if(res<401) break;
int pos = -1;
while(++pos < n){
if(f[pos]==m[pos]) continue;
if(f[pos]==3){
if(u1[pos]<2){
u1[pos]++;
break;
}
u1[pos] = 0;
if(pat[pos]<1){
pat[pos]++;
break;
}
pat[pos] = 0;
} else if(f[pos]==4){
if(pat[pos]<2){
u4(pos);
break;
}
if(pat[pos]==2){
int t1 = u3[pos], t2 = 6-u1[pos]-u2[pos]-t1;
if(t1 < t2){
u3[pos] = t2;
break;
}
if(u2[pos]<3){
t1 = u2[pos];
u2[pos]++;
u3[pos] = min(u2[pos]-1, 7-u1[pos]-2*u2[pos]);
break;
}
if(u1[pos]<2){
u1[pos]++;
u2[pos] = u1[pos]+1;
u3[pos] = min(u1[pos]-1, 7-2*u1[pos]-u2[pos]);
break;
}
u1[pos] = 0;
u2[pos] = 1;
u3[pos] = 2;
pat[pos]++;
break;
}
if(u4(pos)) break;
pat[pos] = 0;
}
}
if(pos == n) break;
}
cout<<(res==INF?-1:res)<<endl;
return 0;
}