struct Floyd {
int n, m;
int edge[maxn][maxn];
void init(int n)
{
this -> n = n;
for(int i = 0;i <= n;i ++)
for(int j = 0;j <= n;j ++)
edge[i][j] = INF;
}
void addEdge(int s, int t, int w)
{
edge[s][t] = w;
}
void floyd()
{
for(int k = 1;k <= n;k ++)
for(int i = 1;i <= n;i ++)
for(int j = 1;j <= n;j ++)
edge[i][j] = min(edge[i][j], edge[i][k] + edge[k][j]);
}
int query(int s, int t)
{
return edge[s][t];
}
}FLOYD;