#include //fillを使うため #include #include using ll = long long; using namespace std; const ll INF = 1LL << 61; struct edge { ll from; // 出発点 ll to; // 到達点 ll cost; // 移動コスト }; int main() { ll V; // 頂点の数 ll side; // 辺の数 ll S; // 始点 ll G; // 終点 vector edges; // 移動の情報を保存する cin >> V; cin >> side; vector A(V); for (ll& a : A) cin >> a; S = 0; G = V - 1; vector d(V, INF); // 始点から添え字の頂点に行くのにかかるコスト d[S] = 0; // 始点を0にする for (int i = 0; i < side; i++) { struct edge add; cin >> add.from; add.from--; cin >> add.to; add.to--; cin >> add.cost; add.cost -= A[add.to]; edges.push_back(add); } for (int i = 0; i < V; i++) { for (int j = 0; j < (int)edges.size(); j++) { struct edge e = edges[j]; if (d[e.to] > d[e.from] + e.cost) { // 移動した後のコストが小さいと、頂点のコストを更新 d[e.to] = d[e.from] + e.cost; if (i == V - 1) { // 頂点の数と同じ回数ループすると、負の閉路があるのでループをぬける cout << "inf" << endl; return 0; } } } } cout << A[S] - d[G] << endl; }