#include<bits/stdc++.h>
using namespace std;
//输入n,m,a,b
//在输入花费的时候 把a换成b的花费存入c[a][b]中
//循环每个宝石
//如果宝石一样就退出循环
//如果能把a换成b x=a换成b的花费
//如果能把b换成a x=b换成a的花费
//如果两个都可以 求最小值
//如果两个不都可以 退出循环
int n,m,ans;
int a[10004],b[10004],c[401][401];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
cin>>b[i];
}
//输入n,m,a,b
int x,y,z;
for(int i=1;i<=m;i++){
cin>>x>>y>>z;
if(c[x][y]==0) c[x][y]=z;//在输入花费的时候 把a换成b的花费存入c[a][b]中
else c[x][y]=min(c[x][y],z);
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(c[x][a[j]]&&c[a[j]][y]) c[x][y]=min(c[x][a[j]]+c[a[j]][y],c[x][y]);
}
for(int j=1;j<=n;j++){
if(c[a[j]][x]){
if(c[a[j]][y]==0) c[a[j]][y]=c[a[j]][x]+c[x][y];
else c[a[j]][y]=min(c[a[j]][x]+c[x][y],c[a[j]][y]);
}
if(c[y][a[j]]){
if(c[x][a[j]]==0) c[x][a[j]]=c[x][y]+c[y][a[j]];
else c[x][a[j]]=min(c[x][y]+c[y][a[j]],c[x][a[j]]);
}
}
}
for(int i=1;i<=n;i++){//循环每个宝石
if(a[i]==b[i]) continue;//如果宝石一样就退出循环
if(c[a[i]][b[i]]) x=c[a[i]][b[i]];//如果能把a换成b x=a换成b的花费
else x=INT_MAX;
if(c[b[i]][a[i]]) y=c[b[i]][a[i]];//如果能把b换成a x=b换成a的花费
else y=INT_MAX;
if(x==INT_MAX&&y==INT_MAX){//如果两个不都可以 退出循环
cout<<-1;
return 0;
}
else ans+=min(x,y);//如果两个都可以 求最小值
}
cout<<ans;
}
/**************************************************************
Problem: 2355
User: wuyunfeng
Language: C++
Result: Time Limit Exceed
****************************************************************/