void dfs(int x, int p) {
f[x][0] = p;
dis[x][0] = e[p].w;
depth[x] = depth[p] + 1;
for (int i = 1; i <= lg[depth[x]]; i++) {
dis[x][i] = min(dis[x][i], min(dis[x][i - 1], dis[f[x][i - 1]][i - 1]));
f[x][i] = f[f[x][i - 1]][i - 1];
}
for (int i = head[x]; ~i; i = e[i].nxt)
if (e[i].to != p) dfs(e[i].to, x);
}