#include<stdio.h>
#define MIN(a,b) a<=b?a:b
int dp[ 10000 ] [ 15 ] , src[ 110 ] , dest[ 110 ] , n, m, hmcty;
long long int dist[ 110 ] [ 110 ] ;
void init( )
{
int i, j;
for ( i= 0 ; i<= n+ 1 ; i++ )
for ( j= 0 ; j<= n+ 1 ; j++ )
{ if ( i== j) dist[ i] [ j] = 0 ;
else dist[ i] [ j] =- 1 ;
}
return ;
}
void update( )
{
int i, j, k;
for ( i= 0 ; i<= n- 1 ; i++ )
for ( j= 0 ; j<= n- 1 ; j++ )
for ( k= 0 ; k<= n- 1 ; k++ )
{
if ( dist[ i] [ k] !=- 1 && dist[ k] [ j] !=- 1 )
{
if ( dist[ i] [ j] ==- 1 )
dist[ i] [ j] = dist[ i] [ k] + dist[ k] [ j] ;
else
dist[ i] [ j] = MIN( dist[ i] [ j] , dist[ i] [ k] + dist[ k] [ j] ) ;
}
}
return ;
}
int main( )
{
int i, j, k, u, v, d, z, mask, cnt, count;
long long int res;
while ( count!= 0 )
{
scanf ( "%d%d%d" ,& n
,& m
,& hmcty
) ; hmcty--;
init( ) ;
for ( i= 1 ; i<= m; i++ )
{
scanf ( "%d%d%d" ,& u
,& v
,& d
) ; u--;
v--;
if ( dist[ u] [ v] ==- 1 )
{
dist[ u] [ v] = d;
dist[ v] [ u] = d;
}
else
{
dist[ u] [ v] = MIN( dist[ u] [ v] , d) ;
dist[ u] [ v] = dist[ u] [ v] ;
}
}
update( ) ; //Applying Floyd-Warshall
j= 0 ;
for ( i= 1 ; i<= z; i++ )
{
scanf ( "%d%d%d" ,& u
,& v
,& d
) ; while ( d> 0 )
{
src[ j] = u- 1 ; //The source city is stored if src[] and destination city is stored in dest[]
dest[ j] = v- 1 ;
j++;
d--;
}
}
cnt= j; //cnt stores total requests made.
for ( mask= 1 ; mask<= ( 1 << cnt) - 1 ; mask++ )
{
if ( ! ( mask& ( mask- 1 ) ) ) //if mask is a power of 2
{
i= 0 ;
while ( ! ( mask& ( 1 << i) ) ) i++;
dp[ mask] [ i] = dist[ hmcty] [ src[ i] ] + dist[ src[ i] ] [ dest[ i] ] ;
}
else
{
i= 0 ;
while ( ( 1 << i) <= mask)
{
if ( mask& ( 1 << i) )
{
j= 0 ;
res=- 1 ;
while ( ( 1 << j) <= ( mask^ ( 1 << i) ) ) //finding the minimum value for dp[mask][i] considering all j whose bit is set in mask
{
if ( ( mask& ( 1 << j) ) && j!= i)
{
if ( res==- 1 ) res= dp[ mask^ ( 1 << i) ] [ j] + dist[ dest[ j] ] [ src[ i] ] + dist[ src[ i] ] [ dest[ i] ] ;
else res= MIN( res, dp[ mask^ ( 1 << i) ] [ j] + dist[ dest[ j] ] [ src[ i] ] + dist[ src[ i] ] [ dest[ i] ] ) ;
}
j++;
}
dp[ mask] [ i] = res;
}
i++;
}
}
}
res= dp[ mask- 1 ] [ 0 ] + dist[ dest[ 0 ] ] [ hmcty] ; //dist[dest[i]][hmcty] denotes the shortest distance from destination city of request i to the home city of courier.
for ( i= 1 ; i<= cnt- 1 ; i++ )
res= MIN( res, dp[ mask- 1 ] [ i] + dist[ dest[ i] ] [ hmcty] ) ; // Finding the minimum of all (dp[mask-1][i]+ dist[dest[i]][hmcty]).
count--;
}
return 0 ;
}
I2luY2x1ZGU8c3RkaW8uaD4KI2RlZmluZSBNSU4oYSxiKSBhPD1iP2E6YgoKaW50IGRwWzEwMDAwXVsxNV0sc3JjWzExMF0sZGVzdFsxMTBdLG4sbSxobWN0eTsKbG9uZyBsb25nIGludCBkaXN0WzExMF1bMTEwXTsKdm9pZCBpbml0KCkKewogICAgaW50IGksajsKICAgIGZvcihpPTA7aTw9bisxO2krKykKICAgIGZvcihqPTA7ajw9bisxO2orKykKICAgIHtpZihpPT1qKSBkaXN0W2ldW2pdPTA7CiAgICBlbHNlIGRpc3RbaV1bal09LTE7CiAgICB9CgogICAgcmV0dXJuIDsKfQoKdm9pZCB1cGRhdGUoKQp7CiAgICBpbnQgaSxqLGs7CiAgICBmb3IoaT0wO2k8PW4tMTtpKyspCiAgICBmb3Ioaj0wO2o8PW4tMTtqKyspCiAgICBmb3Ioaz0wO2s8PW4tMTtrKyspCiAgICB7CiAgICAgICAgaWYoZGlzdFtpXVtrXSE9LTEgJiYgZGlzdFtrXVtqXSE9LTEpCiAgICAgICAgewogICAgICAgICAgICBpZihkaXN0W2ldW2pdPT0tMSkKICAgICAgICAgICAgZGlzdFtpXVtqXT1kaXN0W2ldW2tdK2Rpc3Rba11bal07CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgZGlzdFtpXVtqXT1NSU4oZGlzdFtpXVtqXSxkaXN0W2ldW2tdK2Rpc3Rba11bal0pOwoKICAgICAgICB9CgoKICAgICB9CgogICAgcmV0dXJuIDsKfQoKaW50IG1haW4oKQp7CiAgICBpbnQgaSxqLGssdSx2LGQseixtYXNrLGNudCxjb3VudDsKICAgIGxvbmcgbG9uZyBpbnQgcmVzOwogICAgc2NhbmYoIiVkIiwmY291bnQpOwogICAgd2hpbGUoY291bnQhPTApCiAgICB7CiAgICAgICAgc2NhbmYoIiVkJWQlZCIsJm4sJm0sJmhtY3R5KTsKICAgICAgICBobWN0eS0tOwoKICAgICAgICBpbml0KCk7CiAgICAgICAgZm9yKGk9MTtpPD1tO2krKykKICAgICAgICB7CiAgICAgICAgICAgIHNjYW5mKCIlZCVkJWQiLCZ1LCZ2LCZkKTsKICAgICAgICAgICAgdS0tOwogICAgICAgICAgICB2LS07CiAgICAgICAgICAgIGlmKGRpc3RbdV1bdl09PS0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgIGRpc3RbdV1bdl09ZDsKICAgICAgICAgICAgZGlzdFt2XVt1XT1kOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZGlzdFt1XVt2XT1NSU4oZGlzdFt1XVt2XSxkKTsKICAgICAgICAgICAgICAgIGRpc3RbdV1bdl09ZGlzdFt1XVt2XTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdXBkYXRlKCk7ICAgICAgICAgLy9BcHBseWluZyBGbG95ZC1XYXJzaGFsbAoKICAgICAgICBzY2FuZigiJWQiLCZ6KTsKICAgICAgICBqPTA7CiAgICAgICAgZm9yKGk9MTtpPD16O2krKykKICAgICAgICB7CiAgICAgICAgICAgIHNjYW5mKCIlZCVkJWQiLCZ1LCZ2LCZkKTsKICAgICAgICAgICAgd2hpbGUoZD4wKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzcmNbal09dS0xOyAgICAgICAgICAgICAvL1RoZSBzb3VyY2UgY2l0eSBpcyBzdG9yZWQgaWYgc3JjW10gYW5kIGRlc3RpbmF0aW9uIGNpdHkgaXMgc3RvcmVkIGluIGRlc3RbXQogICAgICAgICAgICAgICAgZGVzdFtqXT12LTE7CiAgICAgICAgICAgICAgICBqKys7CiAgICAgICAgICAgICAgICBkLS07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY250PWo7ICAgICAgICAgLy9jbnQgc3RvcmVzIHRvdGFsIHJlcXVlc3RzIG1hZGUuCgoKICAgICAgZm9yKG1hc2s9MTttYXNrPD0oMTw8Y250KS0xO21hc2srKykKICAgICAgewoKICAgICAgICAgIGlmKCEobWFzayYobWFzay0xKSkpICAgICAgICAvL2lmIG1hc2sgaXMgYSBwb3dlciBvZiAyCiAgICAgICAgICB7CgogICAgICAgICAgICAgIGk9MDsKICAgICAgICAgICAgICB3aGlsZSghKG1hc2smKDE8PGkpKSkgaSsrOwogICAgICAgICAgICAgIGRwW21hc2tdW2ldPSBkaXN0W2htY3R5XVtzcmNbaV1dK2Rpc3Rbc3JjW2ldXVtkZXN0W2ldXTsKCiAgICAgICAgICB9CiAgICAgICAgICBlbHNlCiAgICAgICAgICB7CiAgICAgICAgICAgICAgaT0wOwogICAgICAgICAgICAgIHdoaWxlKCgxPDxpKTw9bWFzaykKICAgICAgICAgICAgICB7CgoKICAgICAgICAgICAgICAgICAgaWYobWFzayYoMTw8aSkpCiAgICAgICAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAgICAgICBqPTA7CiAgICAgICAgICAgICAgICAgICAgICByZXM9LTE7CiAgICAgICAgICAgICAgICAgICAgICB3aGlsZSgoMTw8aik8PShtYXNrXigxPDxpKSkpICAgLy9maW5kaW5nIHRoZSBtaW5pbXVtIHZhbHVlIGZvciBkcFttYXNrXVtpXSBjb25zaWRlcmluZyBhbGwgaiB3aG9zZSBiaXQgaXMgc2V0IGluIG1hc2sKICAgICAgICAgICAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKG1hc2smKDE8PGopKSYmIGohPWkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXM9PS0xKSByZXM9ZHBbbWFza14oMTw8aSldW2pdK2Rpc3RbZGVzdFtqXV1bc3JjW2ldXStkaXN0W3NyY1tpXV1bZGVzdFtpXV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgcmVzPU1JTihyZXMsZHBbbWFza14oMTw8aSldW2pdK2Rpc3RbZGVzdFtqXV1bc3JjW2ldXStkaXN0W3NyY1tpXV1bZGVzdFtpXV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBqKys7CiAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgZHBbbWFza11baV09cmVzOwoKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQoKCiAgICAgIH0KCgogICAgICByZXM9ZHBbbWFzay0xXVswXStkaXN0W2Rlc3RbMF1dW2htY3R5XTsgICAgIC8vZGlzdFtkZXN0W2ldXVtobWN0eV0gZGVub3RlcyB0aGUgc2hvcnRlc3QgZGlzdGFuY2UgZnJvbSBkZXN0aW5hdGlvbiBjaXR5IG9mIHJlcXVlc3QgaSB0byB0aGUgaG9tZSBjaXR5IG9mIGNvdXJpZXIuCiAgICAgZm9yKGk9MTtpPD1jbnQtMTtpKyspCiAgICAgIHJlcz1NSU4ocmVzLGRwW21hc2stMV1baV0rZGlzdFtkZXN0W2ldXVtobWN0eV0pOyAgICAgLy8gRmluZGluZyB0aGUgbWluaW11bSBvZiBhbGwgKGRwW21hc2stMV1baV0rIGRpc3RbZGVzdFtpXV1baG1jdHldKS4KCiAgICAgIHByaW50ZigiJWxsZFxuIixyZXMpOwoKICAgICAgY291bnQtLTsKICAgIH0KCiAgICByZXR1cm4gMDsKCn0K