#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
****************************************************************/