基礎的なダイクストラ法で解けます。 マス数が最大でも10000と少ないので、二次元配列distで各マスに行くまでの最小の疲れを記録します。 最初はdist全体をINFとし、最初に置かれているマスのみを0とし、移動先のマスの値を更新していきます。

priority_queueを使って実装することで、大体O(N^2 log N^2)程で実装できます。

writer解

#include<iostream>
#include<vector>
#include<iomanip>
#include<queue>
using namespace std;
#define OVERLOAD_REP(_1, _2, _3, name, ...) name
#define REP1(i, n) for (auto i = std::decay_t<decltype(n)>{}; (i) != (n); ++(i))
#define REP2(i, l, r) for (auto i = (l); (i) != (r); ++(i))
#define rep(...) OVERLOAD_REP(__VA_ARGS__, REP2, REP1)(__VA_ARGS__)
#define REP(i, l, r) rep(i, l, r+1)
using ll = long long;
const ll INF = 2e18;
template<class T> using vv = vector<vector<T> >;
template<class T> using pq_g = priority_queue<T, vector<T>, greater<T> >;
using P = pair<ll, ll>;
template<class T> bool chmin(T& a, T b) {
    if(a > b) {
        a = b;
        return true;
    }
    return false;
}

int main() {
    // 高速化
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    // 小数点の出力桁数を指定
    cout << fixed << setprecision(10);

    // メイン
    int N, M, A, B, C, D;
    cin >> N >> M >> A >> B >> C >> D;
    A--, B--, C--, D--;

    vector<int> dx(M), dy(M), cost(M);
    rep(i, 0, M) cin >> dx[i] >> dy[i] >> cost[i];

    vector<vector<ll>> dist(N, vector<ll>(N, INF));
    dist[A][B] = 0;
    pq_g<pair<ll, P> > que;
    que.push({dist[A][B], P(A, B)});
    while(!que.empty()) {
        ll d = que.top().first;
        int x = que.top().second.first, y = que.top().second.second;
        que.pop();

        if(d > dist[x][y]) continue;
        rep(i, 0, M) {
            int nx = x + dx[i], ny = y + dy[i];
            if(nx < 0 || N <= nx || ny < 0 || N <= ny) continue;
            if(chmin(dist[nx][ny], d + cost[i])) {
                que.push({dist[nx][ny], P(nx, ny)});
            }
        }
    }
    cout << (dist[C][D] == INF ? -1 : dist[C][D]) << endl;

    return 0;
}