#include<bits/stdc++.h>
#define l first
#define r second
using namespace std;
#define int long long
#define f(i, a, b) for(int i = (a); i <= (b); i++)
#define cl(i, n) i.clear(),i.resize(n);
#define endl '\n'
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
const int inf = 1e9;
int fa[200010];
struct edge{
int x,y,z;
edge(){};
edge(int _x,int _y,int _z):x(_x),y(_y),z(_z){}
}e[600010], nn[600010], ne[600010], en[600010];
int cnt,cntnn,cntne,cnten;
int n,m;
bool cmp(edge x,edge y){return x.z < y.z;}
int get(int x){
if(fa[x]==x)return x;
return fa[x]=get(fa[x]);
}
void merge(int x,int y){
x=get(x),y=get(y);
fa[x]=y;
}
int ans=0;
int ret=1e18;
signed main() {
ios::sync_with_stdio(0);
cin.tie(NULL);
cout.tie(NULL);
time_t start = clock();
cin>>n>>m;
f(i,1,n){
int x;cin>>x;
e[++cnt]=edge(i,n+1,x);
en[++cnten]=edge(i,n+1,x);
}
f(i,1,n){
int y;cin>>y;
e[++cnt]=edge(i,n+2,y);
ne[++cntne]=edge(i,n+2,y);
}
f(i,1,m){
int a,b,z; cin>>a>>b>>z;
e[++cnt]=edge(a,b,z);
en[++cnten]=edge(a,b,z);
ne[++cntne]=edge(a,b,z);
nn[++cntnn]=edge(a,b,z);
}
sort(e+1,e+cnt+1,cmp);
sort(en+1,en+cnten+1,cmp);
sort(ne+1,ne+cntne+1,cmp);
sort(nn+1,nn+cntnn+1,cmp);
f(i,1,n+2)fa[i]=i;
f(i,1,cnt){
if(get(e[i].x)==get(e[i].y))continue;
ans+=e[i].z;
merge(e[i].x,e[i].y);
}
ret=min(ret,ans);
ans=0;
f(i,1,n+2)fa[i]=i;
f(i,1,cntnn){
if(get(nn[i].x)==get(nn[i].y))continue;
ans+=nn[i].z;
merge(nn[i].x,nn[i].y);
}
bool ok = 1;
f(i,1,n)if(fa[i]!=fa[1]){ok=0;break;}
if(ok)ret=min(ret,ans);
ans=0;
f(i,1,n+2)fa[i]=i;
f(i,1,cntne){
if(get(ne[i].x)==get(ne[i].y))continue;
ans+=ne[i].z;
merge(ne[i].x,ne[i].y);
}
ok = 1;
f(i,1,n+2)if(i!=n+1&&fa[i]!=fa[1]){ok=0;break;}
if(ok)ret=min(ret,ans);
ans=0;
f(i,1,n+2)fa[i]=i;
f(i,1,cnten){
if(get(en[i].x)==get(en[i].y))continue;
ans+=en[i].z;
merge(en[i].x,en[i].y);
}
ok = 1;
f(i,1,n+2)if(i!=n+2&&fa[i]!=fa[1]){ok=0;break;}
if(ok)ret=min(ret,ans);
cout<<ret<<endl;
time_t finish = clock();
return 0;
}