OI X - prz

// https://szkopul.edu.pl/problemset/problem/l8-ujU0a7HQFxy8UY32B4Kk_/site/?key=statement

#include <algorithm>
#include <bitset>
#include <iostream>
#include <queue>
#include <vector>

constexpr int MAX_N = 5 * 1001, MAX_M = 100 * 1001;

int values[MAX_N];
int values1[MAX_N];
int cost[MAX_N];
std::bitset<MAX_N> visited;

std::vector<std::pair<int, int>> kra1[MAX_N];
std::vector<std::pair<int, int>> kra2[MAX_N];

void Dijkstra(int v, int* arr, std::vector<std::pair<int, int>>* kra) {
    std::priority_queue<std::pair<long long, int>, std::vector<std::pair<long long, int>>, std::greater<std::pair<long long, int>>> q;

    q.push({0, v});
    arr[v] = 0;

    while (!q.empty()) {
        const auto [o, w] = q.top();
        q.pop();

        if (visited[w]) {
            continue;
        }

        visited[w] = true;
        arr[w] = o;

        for (const auto& [u, d] : kra[w]) {
            if (!visited[u]) {
                q.push({d + o, u});
            }
        }
    }
}

int main() {
    std::ios_base::sync_with_stdio(0);
    std::cin.tie(0);
    std::cout.tie(0);

    int n;
    std::cin >> n;

    for (int i = 1; i <= n; i++) {
        std::cin >> cost[i];
    }

    int m;
    std::cin >> m;

    for (int i = 0; i < m; i++) {
        int a, b, c;
        std::cin >> a >> b >> c;

        kra1[a].push_back({b, c});
        kra2[b].push_back({a, c});
    }

    Dijkstra(1, values, kra1);

    std::vector<int> v;

    for (int i = 2; i <= n; i++) {
        if (visited[i]) {
            v.push_back(i);
        }
    }

    for (int i = 1; i <= n; i++) {
        visited[i] = false;
    }

    for (int i = 1; i <= n; i++) {
        values1[i] = -1;
    }

    Dijkstra(1, values1, kra2);

    int ans = cost[1] / 2;

    for (const auto& u : v) {
        if (values1[u] == -1) {
            continue;
        }

        ans = std::min(ans, cost[u] / 2 + values[u] + values1[u]);
    }

    std::cout << ans << '\n';

    return 0;
}