using Graph = vector<vector<int>>;
void warshall_floyd(Graph &G) {
for (int k = 0; k < n; ++k) {
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
G[i][j] = min(G[i][j], G[i][k] + G[k][j]);
{0, 10, INF, 20, INF, INF, INF, 30}, // A (0)
{10, 0, 10, INF, INF, INF, INF, INF}, // B (1)
{INF, 10, 0, INF, 20, INF, INF, INF}, // C (2)
{20, INF, INF, 0, INF, 20, INF, INF}, // D (3)
{INF, INF, 20, INF, 0, INF, INF, 20}, // E (4)
{INF, INF, INF, 20, INF, 0, 10, INF}, // F (5)
{INF, INF, INF, INF, INF, 10, 0, 10}, // G (6)
{30, INF, INF, INF, 20, INF, 10, 0} // H (7)
for (vector<int> costs : G) {