#include<bits/stdc++.h>
#define ll long long
// compute shortest paths from 1 source to every vertices
// negative weight - tolerant
struct BellmanFord {
// NOTE:
// vertices are ZERO-indexed
// DIRECTIONAL graph
int n, m;
ll *dist;
int starter;
pair< pair<int, int>, int> *edges;
int cnt_edge;
ll INF;
bool computed;
void init(int n_, int m_, int starter_) {
n = n_;
m = m_;
starter = starter_;
computed = 0;
INF = 1; INF = INF * oo * oo;
dist = new ll [n+1];
for (int i = 0; i <= n; ++i) {
if (i == starter)
dist[i] = 0;
else
dist[i] = INF;
}
edges = new pair< pair<int, int>, int> [m];
cnt_edge = 0;
}
void addEdge(int u, int v, int w) {
edges[cnt_edge++] = make_pair(make_pair(u, v), w);
}
void computeShortestPaths() {
int u, v, w;
// compute shortest paths
for (int i = 1; i < n; ++i) {
for (int j = 0; j < cnt_edge; ++j) {
u = edges[j].first.first;
v = edges[j].first.second;
w = edges[j].second;
if (dist[u] != INF && dist[v] > dist[u] + w)
dist[v] = dist[u] + w;
}
}
// detect negative cycle
for (int i = 1; i < n; ++i) {
for (int j = 0; j < cnt_edge; ++j) {
u = edges[j].first.first;
v = edges[j].first.second;
w = edges[j].second;
if (dist[u] != INF && dist[v] != -INF && dist[v] > dist[u] + w)
dist[v] = -INF;
}
}
}
ll distanceTo(int v) {
if (!computed) {
computeShortestPaths();
computed = 1;
}
return dist[v];
}
};