#include #include #define INF -1 #define TRUE 1 #define FALSE 0 #define NEDEFINISANO -2 int manji( int x, int y ) { if ( x == INF ) return FALSE; if ( y == INF ) return TRUE; return x < y; } int zbir( int x, int y ) { if ( x == INF || y == INF ) return INF; return x + y; } int main() { int brGradova, brGrana; scanf("%d%d", &brGradova, &brGrana ); int **graf = ( int ** ) malloc( brGradova * sizeof( int * ) ); int **rast = ( int ** ) malloc( brGradova * sizeof( int * ) ); int **pret = ( int ** ) malloc( brGradova * sizeof( int * ) ); for ( int i = 0; i < brGradova; i ++ ) { graf[ i ] = ( int * ) malloc( brGradova * sizeof( int ) ); rast[ i ] = ( int * ) malloc( brGradova * sizeof( int ) ); pret[ i ] = ( int * ) malloc( brGradova * sizeof( int ) ); for ( int j = 0; j < brGradova; j ++ ) { graf[ i ][ j ] = rast[ i ][ j ] = INF; pret[ i ][ j ] = NEDEFINISANO; } } for ( int i = 0; i < brGrana; i ++ ) { int x, y, t; scanf("%d%d%d", &x, &y, &t ); graf[ x ][ y ] = graf[ y ][ x ] = rast[ x ][ y ] = rast[ y ][ x ] = t; pret[ x ][ y ] = x; pret[ y ][ x ] = y; } for ( int i = 0; i < brGradova; i ++ ) graf[ i ][ i ] = rast[ i ][ i ] = 0; for ( int k = 0; k < brGradova; k ++ ) for ( int i = 0; i < brGradova; i ++ ) for ( int j = 0; j < brGradova; j ++ ) if ( manji( zbir( rast[ i ][ k ], rast[ k ][ j ] ), rast[ i ][ j ] ) ) { rast[ i ][ j ] = rast[ i ][ k ] + rast[ k ][ j ]; pret[ i ][ j ] = pret[ k ][ j ]; } int *raspon = ( int * ) malloc( brGradova * sizeof( int ) ); for ( int i = 0; i < brGradova; i ++ ) { raspon[ i ] = rast[ i ][ 0 ]; for ( int j = 1; j < brGradova; j ++ ) if ( manji( raspon[ i ], rast[ i ][ j ] ) ) raspon[ i ] = rast[ i ][ j ]; } int minRaspon = raspon[ 0 ]; int minGrad = 0; for ( int i = 1; i < brGradova; i ++ ) if ( manji( raspon[ i ], minRaspon ) ) { minRaspon = raspon[ i ]; minGrad = i; } printf("%d\n%d\n", minGrad, minRaspon ); return 0; }