#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("inline")
#include<bits/stdc++.h>
using namespace std;
void * wmem;
char memarr[ 96000000 ] ;
template < class T> inline void walloc1d( T ** arr, int x, void ** mem = & wmem) {
static int skip[ 16 ] = { 0 , 15 , 14 , 13 , 12 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 } ;
( * mem) = ( void * ) ( ( ( char * ) ( * mem) ) + skip[ ( ( unsigned long long ) ( * mem) ) & 15 ] ) ;
( * arr) = ( T* ) ( * mem) ;
( * mem) = ( ( * arr) + x) ;
}
template < class T> inline void walloc1d( T ** arr, int x1, int x2, void ** mem = & wmem) {
walloc1d( arr, x2- x1, mem) ;
( * arr) - = x1;
}
template < class T, class S> inline T RoundDown( T a, S b) {
T m;
if ( b < 0 ) {
b = - b;
}
if ( b <= 1 ) {
return a;
}
m = a % b;
if ( m == 0 ) {
return a;
}
if ( m < 0 ) {
m + = b;
}
return ( ( a - m) / b) * b;
}
template < class S, class T> inline S chmax( S & a, T b) {
if ( a< b) {
a= b;
}
return a;
}
struct graph{
int N;
int * es;
int ** edge;
void setEdge( int N__, int M, int A[ ] , int B[ ] , void ** mem = & wmem) {
int i;
N = N__;
walloc1d( & es, N, mem) ;
walloc1d( & edge, N, mem) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
es[ i] = 0 ;
}
for ( i= ( 0 ) ; i< ( M) ; i++ ) {
es[ A[ i] ] ++ ;
es[ B[ i] ] ++ ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
walloc1d( & edge[ i] , es[ i] , mem) ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
es[ i] = 0 ;
}
for ( i= ( 0 ) ; i< ( M) ; i++ ) {
edge[ A[ i] ] [ es[ A[ i] ] ++ ] = B[ i] ;
edge[ B[ i] ] [ es[ B[ i] ] ++ ] = A[ i] ;
}
}
void getDist( int root, int res[ ] , void * mem = wmem) {
int i;
int j;
int k;
int * q;
int s;
int z;
walloc1d( & q, N, & mem) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
res[ i] = - 1 ;
}
res[ root] = 0 ;
s= 0 ;
z= 1 ;
q[ 0 ] = root;
while ( z) {
i= q[ s++ ] ;
z-- ;
for ( j= ( 0 ) ; j< ( es[ i] ) ; j++ ) {
k= edge[ i] [ j] ;
if ( res[ k] >= 0 ) {
continue ;
}
res[ k] = res[ i] + 1 ;
q[ s+ z++ ] = k;
}
}
}
int getDist( int a, int b, void * mem = wmem) {
int i;
int j;
int k;
int * q;
int s;
int z;
int * d;
if ( a== b) {
return 0 ;
}
walloc1d( & d, N, & mem) ;
walloc1d( & q, N, & mem) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
d[ i] = - 1 ;
}
d[ a] = 0 ;
s = 0 ;
z = 1 ;
q[ 0 ] = a;
while ( z) {
i = q[ s++ ] ;
z-- ;
for ( j= ( 0 ) ; j< ( es[ i] ) ; j++ ) {
k = edge[ i] [ j] ;
if ( d[ k] >= 0 ) {
continue ;
}
d[ k] = d[ i] + 1 ;
if ( k== b) {
return d[ k] ;
}
q[ s+ z++ ] = k;
}
}
return - 1 ;
}
}
;
template < class T, class S> inline int vec2arr( vector< T> & v, S arr[ ] ) {
int i;
int N = v.size ( ) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
arr[ i] = v[ i] ;
}
return N;
}
template < class T, class S1, class S2> inline int vec2arr( vector< vector< T>> & v, S1 arr1[ ] , S2 arr2[ ] ) {
int i;
int N = v.size ( ) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
arr1[ i] = v[ i] [ 0 ] ;
arr2[ i] = v[ i] [ 1 ] ;
}
return N;
}
template < class T, class S1, class S2, class S3> inline int vec2arr( vector< vector< T>> & v, S1 arr1[ ] , S2 arr2[ ] , S3 arr3[ ] ) {
int i;
int N = v.size ( ) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
arr1[ i] = v[ i] [ 0 ] ;
arr2[ i] = v[ i] [ 1 ] ;
arr3[ i] = v[ i] [ 2 ] ;
}
return N;
}
#define main dummy_main
int main( ) {
wmem = memarr;
return 0 ;
}
#undef main
int N;
int M;
int A[ 100000 ] ;
int B[ 100000 ] ;
int P[ 100000 ] ;
int dist[ 100000 ] ;
graph g;
class Solution{
public :
int networkBecomesIdle( vector< vector< int >> & edges, vector< int > & patience) {
int i;
dummy_main( ) ;
int res = - 1 ;
int f;
N = vec2arr( patience, P) ;
M = vec2arr( edges, A, B) ;
g.setEdge ( N,M,A,B) ;
g.getDist ( 0 ,dist) ;
for ( i= ( 1 ) ; i< ( N) ; i++ ) {
f = 2 * dist[ i] ;
chmax( res, f + RoundDown( f- 1 , P[ i] ) ) ;
}
return res+ 1 ;
}
}
;
// cLay version 20210926-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// int N, M, A[1d5], B[], P[], dist[];
// graph g;
//
// class Solution {
// public:
// int networkBecomesIdle(vector<vector<int>>& edges, vector<int>& patience) {
// dummy_main();
// int res = -1, f;
// N = vec2arr(patience, P);
// M = vec2arr(edges, A, B);
// g.setEdge(N,M,A,B);
// g.getDist(0,dist);
// rep(i,1,N){
// f = 2 * dist[i];
// res >?= f + RoundDown(f-1, P[i]);
// }
// return res+1;
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk9mYXN0IikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoInVucm9sbC1sb29wcyIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCJpbmxpbmUiKQojaW5jbHVkZTxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp2b2lkKndtZW07CmNoYXIgbWVtYXJyWzk2MDAwMDAwXTsKdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIHZvaWQgd2FsbG9jMWQoVCAqKmFyciwgaW50IHgsIHZvaWQgKiptZW0gPSAmd21lbSl7CiAgc3RhdGljIGludCBza2lwWzE2XSA9IHswLCAxNSwgMTQsIDEzLCAxMiwgMTEsIDEwLCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyLCAxfTsKICAoKm1lbSkgPSAodm9pZCopKCAoKGNoYXIqKSgqbWVtKSkgKyBza2lwWygodW5zaWduZWQgbG9uZyBsb25nKSgqbWVtKSkgJiAxNV0gKTsKICAoKmFycik9KFQqKSgqbWVtKTsKICAoKm1lbSk9KCgqYXJyKSt4KTsKfQp0ZW1wbGF0ZTxjbGFzcyBUPiBpbmxpbmUgdm9pZCB3YWxsb2MxZChUICoqYXJyLCBpbnQgeDEsIGludCB4Miwgdm9pZCAqKm1lbSA9ICZ3bWVtKXsKICB3YWxsb2MxZChhcnIsIHgyLXgxLCBtZW0pOwogICgqYXJyKSAtPSB4MTsKfQp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBTPiBpbmxpbmUgVCBSb3VuZERvd24oVCBhLCBTIGIpewogIFQgbTsKICBpZihiIDwgMCl7CiAgICBiID0gLWI7CiAgfQogIGlmKGIgPD0gMSl7CiAgICByZXR1cm4gYTsKICB9CiAgbSA9IGEgJSBiOwogIGlmKG0gPT0gMCl7CiAgICByZXR1cm4gYTsKICB9CiAgaWYobSA8IDApewogICAgbSArPSBiOwogIH0KICByZXR1cm4gKChhIC0gbSkgLyBiKSAqIGI7Cn0KdGVtcGxhdGU8Y2xhc3MgUywgY2xhc3MgVD4gaW5saW5lIFMgY2htYXgoUyAmYSwgVCBiKXsKICBpZihhPGIpewogICAgYT1iOwogIH0KICByZXR1cm4gYTsKfQpzdHJ1Y3QgZ3JhcGh7CiAgaW50IE47CiAgaW50KmVzOwogIGludCoqZWRnZTsKICB2b2lkIHNldEVkZ2UoaW50IE5fXywgaW50IE0sIGludCBBW10sIGludCBCW10sIHZvaWQgKiptZW0gPSAmd21lbSl7CiAgICBpbnQgaTsKICAgIE4gPSBOX187CiAgICB3YWxsb2MxZCgmZXMsIE4sIG1lbSk7CiAgICB3YWxsb2MxZCgmZWRnZSwgTiwgbWVtKTsKICAgIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgICBlc1tpXSA9IDA7CiAgICB9CiAgICBmb3IoaT0oMCk7aTwoTSk7aSsrKXsKICAgICAgZXNbQVtpXV0rKzsKICAgICAgZXNbQltpXV0rKzsKICAgIH0KICAgIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgICB3YWxsb2MxZCgmZWRnZVtpXSwgZXNbaV0sIG1lbSk7CiAgICB9CiAgICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgICAgZXNbaV0gPSAwOwogICAgfQogICAgZm9yKGk9KDApO2k8KE0pO2krKyl7CiAgICAgIGVkZ2VbQVtpXV1bZXNbQVtpXV0rK10gPSBCW2ldOwogICAgICBlZGdlW0JbaV1dW2VzW0JbaV1dKytdID0gQVtpXTsKICAgIH0KICB9CiAgdm9pZCBnZXREaXN0KGludCByb290LCBpbnQgcmVzW10sIHZvaWQgKm1lbSA9IHdtZW0pewogICAgaW50IGk7CiAgICBpbnQgajsKICAgIGludCBrOwogICAgaW50KnE7CiAgICBpbnQgczsKICAgIGludCB6OwogICAgd2FsbG9jMWQoJnEsIE4sICZtZW0pOwogICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgIHJlc1tpXT0tMTsKICAgIH0KICAgIHJlc1tyb290XT0wOwogICAgcz0wOwogICAgej0xOwogICAgcVswXT1yb290OwogICAgd2hpbGUoeil7CiAgICAgIGk9cVtzKytdOwogICAgICB6LS07CiAgICAgIGZvcihqPSgwKTtqPChlc1tpXSk7aisrKXsKICAgICAgICBrPWVkZ2VbaV1bal07CiAgICAgICAgaWYocmVzW2tdPj0wKXsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICByZXNba109cmVzW2ldKzE7CiAgICAgICAgcVtzK3orK109azsKICAgICAgfQogICAgfQogIH0KICBpbnQgZ2V0RGlzdChpbnQgYSwgaW50IGIsIHZvaWQgKm1lbSA9IHdtZW0pewogICAgaW50IGk7CiAgICBpbnQgajsKICAgIGludCBrOwogICAgaW50KnE7CiAgICBpbnQgczsKICAgIGludCB6OwogICAgaW50KmQ7CiAgICBpZihhPT1iKXsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICB3YWxsb2MxZCgmZCwgTiwgJm1lbSk7CiAgICB3YWxsb2MxZCgmcSwgTiwgJm1lbSk7CiAgICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgICAgZFtpXSA9IC0xOwogICAgfQogICAgZFthXSA9IDA7CiAgICBzID0gMDsKICAgIHogPSAxOwogICAgcVswXSA9IGE7CiAgICB3aGlsZSh6KXsKICAgICAgaSA9IHFbcysrXTsKICAgICAgei0tOwogICAgICBmb3Ioaj0oMCk7ajwoZXNbaV0pO2orKyl7CiAgICAgICAgayA9IGVkZ2VbaV1bal07CiAgICAgICAgaWYoZFtrXSA+PSAwKXsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBkW2tdID0gZFtpXSArIDE7CiAgICAgICAgaWYoaz09Yil7CiAgICAgICAgICByZXR1cm4gZFtrXTsKICAgICAgICB9CiAgICAgICAgcVtzK3orK10gPSBrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gLTE7CiAgfQp9CjsKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUz4gaW5saW5lIGludCB2ZWMyYXJyKHZlY3RvcjxUPiAmdiwgUyBhcnJbXSl7CiAgaW50IGk7CiAgaW50IE4gPSB2LnNpemUoKTsKICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgIGFycltpXSA9IHZbaV07CiAgfQogIHJldHVybiBOOwp9CnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFMxLCBjbGFzcyBTMj4gaW5saW5lIGludCB2ZWMyYXJyKHZlY3Rvcjx2ZWN0b3I8VD4+ICZ2LCBTMSBhcnIxW10sIFMyIGFycjJbXSl7CiAgaW50IGk7CiAgaW50IE4gPSB2LnNpemUoKTsKICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgIGFycjFbaV0gPSB2W2ldWzBdOwogICAgYXJyMltpXSA9IHZbaV1bMV07CiAgfQogIHJldHVybiBOOwp9CnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFMxLCBjbGFzcyBTMiwgY2xhc3MgUzM+IGlubGluZSBpbnQgdmVjMmFycih2ZWN0b3I8dmVjdG9yPFQ+PiAmdiwgUzEgYXJyMVtdLCBTMiBhcnIyW10sIFMzIGFycjNbXSl7CiAgaW50IGk7CiAgaW50IE4gPSB2LnNpemUoKTsKICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgIGFycjFbaV0gPSB2W2ldWzBdOwogICAgYXJyMltpXSA9IHZbaV1bMV07CiAgICBhcnIzW2ldID0gdltpXVsyXTsKICB9CiAgcmV0dXJuIE47Cn0KI2RlZmluZSBtYWluIGR1bW15X21haW4KaW50IG1haW4oKXsKICB3bWVtID0gbWVtYXJyOwogIHJldHVybiAwOwp9CiN1bmRlZiBtYWluCmludCBOOwppbnQgTTsKaW50IEFbMTAwMDAwXTsKaW50IEJbMTAwMDAwXTsKaW50IFBbMTAwMDAwXTsKaW50IGRpc3RbMTAwMDAwXTsKZ3JhcGggZzsKY2xhc3MgU29sdXRpb257CiAgcHVibGljOgogIGludCBuZXR3b3JrQmVjb21lc0lkbGUodmVjdG9yPHZlY3RvcjxpbnQ+PiYgZWRnZXMsIHZlY3RvcjxpbnQ+JiBwYXRpZW5jZSl7CiAgICBpbnQgaTsKICAgIGR1bW15X21haW4oKTsKICAgIGludCByZXMgPSAtMTsKICAgIGludCBmOwogICAgTiA9IHZlYzJhcnIocGF0aWVuY2UsIFApOwogICAgTSA9IHZlYzJhcnIoZWRnZXMsIEEsIEIpOwogICAgZy5zZXRFZGdlKE4sTSxBLEIpOwogICAgZy5nZXREaXN0KDAsZGlzdCk7CiAgICBmb3IoaT0oMSk7aTwoTik7aSsrKXsKICAgICAgZiA9IDIgKiBkaXN0W2ldOwogICAgICBjaG1heChyZXMsIGYgKyBSb3VuZERvd24oZi0xLCBQW2ldKSk7CiAgICB9CiAgICByZXR1cm4gcmVzKzE7CiAgfQp9CjsKLy8gY0xheSB2ZXJzaW9uIDIwMjEwOTI2LTEKCi8vIC0tLSBvcmlnaW5hbCBjb2RlIC0tLQovLyAjZGVmaW5lIG1haW4gZHVtbXlfbWFpbgovLyB7fQovLyAjdW5kZWYgbWFpbgovLyAKLy8gaW50IE4sIE0sIEFbMWQ1XSwgQltdLCBQW10sIGRpc3RbXTsKLy8gZ3JhcGggZzsKLy8gCi8vIGNsYXNzIFNvbHV0aW9uIHsKLy8gcHVibGljOgovLyAgIGludCBuZXR3b3JrQmVjb21lc0lkbGUodmVjdG9yPHZlY3RvcjxpbnQ+PiYgZWRnZXMsIHZlY3RvcjxpbnQ+JiBwYXRpZW5jZSkgewovLyAgICAgZHVtbXlfbWFpbigpOwovLyAgICAgaW50IHJlcyA9IC0xLCBmOwovLyAgICAgTiA9IHZlYzJhcnIocGF0aWVuY2UsIFApOwovLyAgICAgTSA9IHZlYzJhcnIoZWRnZXMsIEEsIEIpOwovLyAgICAgZy5zZXRFZGdlKE4sTSxBLEIpOwovLyAgICAgZy5nZXREaXN0KDAsZGlzdCk7Ci8vICAgICByZXAoaSwxLE4pewovLyAgICAgICBmID0gMiAqIGRpc3RbaV07Ci8vICAgICAgIHJlcyA+Pz0gZiArIFJvdW5kRG93bihmLTEsIFBbaV0pOwovLyAgICAgfQovLyAgICAgcmV0dXJuIHJlcysxOwovLyAgIH0KLy8gfTsK