基礎的なダイクストラ法で解けます。 マス数が最大でも10000と少ないので、二次元配列distで各マスに行くまでの最小の疲れを記録します。 最初はdist全体をINFとし、最初に置かれているマスのみを0とし、移動先のマスの値を更新していきます。
priority_queueを使って実装することで、大体O(N^2 log N^2)程で実装できます。
#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;
}