#include <bits/stdc++.h>
using
namespace
std;
#define int long long
void
shortPath(
int
N, vector<vector<
int
> >& edg,
vector<
int
>& A, vector<vector<
int
> >& Q)
{
vector<vector<
int
> > dp(N + 1,
vector<
int
>(N + 1, INT_MAX));
vector<vector<
int
> > ans(N + 1,
vector<
int
>(N + 1, INT_MIN));
for
(
int
i = 0; i < edg.size(); i++) {
dp[edg[i][0]][edg[i][1]] = 1;
ans[edg[i][0]][edg[i][1]]
= A[edg[i][0] - 1] + A[edg[i][1] - 1];
}
for
(
int
k = 1; k <= N; k++) {
for
(
int
i = 1; i <= N; i++) {
for
(
int
j = 1; j <= N; j++) {
if
(dp[i][j] > dp[i][k] + dp[k][j]) {
dp[i][j] = dp[i][k] + dp[k][j];
ans[i][j]
= ans[i][k] + ans[k][j] - A[k - 1];
}
else
if
(dp[i][j] == dp[i][k] + dp[k][j]
and ans[i][j] < ans[i][k]
+ ans[k][j]
- A[k - 1]) {
ans[i][j]
= ans[i][k] + ans[k][j] - A[k - 1];
}
}
}
}
for
(
int
i = 0; i < Q.size(); i++) {
int
U = Q[i][0], V = Q[i][1];
if
(dp[U][V] <= N * N)
cout << dp[U][V] <<
" "
<< ans[U][V] << endl;
else
cout <<
"-1"
<< endl;
}
}
int32_t main()
{
int
N1 = 5;
vector<vector<
int
> > edg1
= { { 1, 2 }, { 1, 3 }, { 2, 3 }, { 3, 4 }, { 3, 5 }, { 4, 1 }, { 5, 1 } };
vector<
int
> A1 = { 30, 50, 70, 20, 60 };
vector<vector<
int
> > Q1
= { { 1, 3 }, { 3, 1 }, { 4, 5 } };
shortPath(N1, edg1, A1, Q1);
cout << endl;
int
N2 = 2;
vector<vector<
int
> > edg2 = {};
vector<
int
> A2 = { 100, 100 };
vector<vector<
int
> > Q2 = { { 1, 2 } };
shortPath(N2, edg2, A2, Q2);
return
0;
}