// rozwiazanie wzorcowe
// Eryk Kopczynski

#include <stdio.h>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;

#define MAXN 500000
#define MAXM 500000

int prices[MAXN];

vector<vector<int> > pairs;

int err, N, M;

map<int, int> freecosts;

int main() {
  
  err=scanf("%d", &N);
  
  for(int i=0; i<N; i++) err=scanf("%d", prices+i);
  pairs.resize(N);

  for(int i=0; i<N; i++) {
    int c = prices[i];
    pairs[i].push_back(i);
    freecosts[c]++;
    }
  
  err=scanf("%d", &M);
  
  int best = 2000000000;
  
  while(M) {
    M--;
    int u, v, cost;
    err=scanf("%d%d%d", &u, &v, &cost); u--; v--;
    pairs[u].push_back(v);
    pairs[v].push_back(u);
    int ncost = cost + cost + prices[u] + prices[v];
    if(ncost < best) best = ncost;
    }
  
  for(int i=0; i<N; i++) {
    for(size_t s=0; s<pairs[i].size(); s++) {
      int j = pairs[i][s];
      int c = prices[j];
      freecosts[c]--;
      if(freecosts[c] == 0) freecosts.erase(c);
      }
    if(freecosts.size()) {
      int ncost = freecosts.begin()->first + prices[i];
      if(ncost < best) best = ncost;
      }
    for(size_t s=0; s<pairs[i].size(); s++) {
      int j = pairs[i][s];
      int c = prices[j];
      freecosts[c]++;
      }
    }
  printf("%d\n", best);
  return 0;
  }
