#include<bits/stdc++.h>
#define ll long long
// compute shortest paths between any pair of vertices
// negative weight - tolerant
struct WarshallFloyd {
// NOTE:
// vertices can be both ZERO-indexed or ONE-indexed
// DIRECTIONAL graph
int n;
ll **dist;
ll INF;
void init(int n_) {
n = n_;
dist = new ll *[n+1];
INF = 1; INF = INF * oo * oo;
for (int i = 0; i <= n; ++i) {
dist[i] = new ll[n+1];
}
for (int i = 0; i <= n; ++i)
for (int j = 0; j <= n; ++j) {
if (i == j)
dist[i][j] = 0;
else
dist[i][j] = INF;
}
}
void addEdge(int u, int v, int w) {
if (dist[u][v] > w)
dist[u][v] = w;
}
void computeShortestPaths() {
// compute shortest paths
for (int k = 0; k <= n; ++k)
for (int i = 0; i <= n; ++i)
for (int j = 0; j <= n; ++j)
if (dist[i][k] != INF && dist[k][j] != INF &&
dist[i][k] + dist[k][j] < dist[i][j])
dist[i][j] = dist[i][k] + dist[k][j];
// detect negative cycle
for(int i = 0; i <= n; ++i)
for (int j = 0; j <= n; ++j)
for (int k = 0; k <= n; ++k)
if (dist[k][k] < 0 && dist[i][k] != INF && dist[k][j] != INF)
dist[i][j] = -INF;
}
ll getDistance(int u, int v) {
return dist[u][v];
}
};