#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int VM=220;
const int EM=50010;
const int INF=0x3f3f3f3f;
int n,m,src,des,map[VM][VM],dis[VM][VM];
int total,gold[VM],store[VM],dep[VM];
int min(int a,int b) {
return a>b?b:a;
}
void buildgraph(int x){
int i;
memset(map,0,sizeof(map));
for( i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(dis[i][j]<=x)
map[i][j]=INF;
for( i=1;i<=n;i++){
map[src][i]=gold[i];
map[i][des]=store[i];
}
}
int BFS(){
queue<int> q;
while(!q.empty())
q.pop();
memset(dep,-1,sizeof(dep));
dep[src]=0;
q.push(src);
while(!q.empty()){
int u=q.front();
q.pop();
for(int v=src;v<=des;v++)
if(map[u][v]>0 && dep[v]==-1){
dep[v]=dep[u]+1;
q.push(v);
}
}
return dep[des]!=-1;
}
int DFS(int u,int minx){
if(u==des)
return minx;
int tmp;
for(int v=src;v<=des;v++)
if(map[u][v]>0 && dep[v]==dep[u]+1 && (tmp=DFS(v,min(minx,map[u][v])))){
map[u][v]-=tmp;
map[v][u]+=tmp;
return tmp;
}
dep[u]=-1;
return 0;
}
int Dinic(){
int ans=0,tmp;
while(BFS()){
while(1){
tmp=DFS(src,INF);
if(tmp==0)
break;
ans+=tmp;
}
}
return ans;
}
int main(){
//freopen("input.txt","r",stdin);
int i,j;
while(~scanf("%d",&n) && n){
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
dis[i][j]=INF;
total=0;
src=0, des=n+1;
for( i=1;i<=n;i++){
scanf("%d",&gold[i]);
total+=gold[i]; //宝藏的总数
}
for( i=1;i<=n;i++)
scanf("%d",&store[i]);
scanf("%d",&m);
int u,v,w;
while(m--){
scanf("%d%d%d",&u,&v,&w);
dis[u][v]=dis[v][u]=w;
}
int l=0,r=100010;
int ans=-1,tmp;
while(l<=r){
int mid=(l+r)>>1;
buildgraph(mid);
tmp=Dinic();
if(tmp==total){
ans=mid;
r=mid-1;
}else
l=mid+1;
}
if(ans==-1)
printf("No Solution\n");
else
printf("%d\n",ans);
}
return 0;
}