unittest
{
	assert( [ "3 3 3", "1 2 3", "1 2 1", "2 3 1", "3 1 4" ].parse.expand.solve == 2 );
	assert( [ "3 3 2", "1 3", "2 3 2", "1 3 6", "1 2 2" ].parse.expand.solve == 4 );
	assert( [ "4 6 3", "2 3 4", "1 2 4", "2 3 3", "4 3 1", "1 4 1", "4 2 2", "3 1 6" ].parse.expand.solve == 3 );
}



import std.algorithm;
import std.conv;
import std.range;
import std.stdio;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto nmr = input.front.split.to!( long[] );
	input.popFront;
	auto rs = input.front.split.to!( long[] );
	auto abcs = new long[][]( nmr[ 1 ], 3 );
	foreach( ref abc; abcs )
	{
		input.popFront;
		abc = input.front.split.to!( long[] );
	}
	return tuple( nmr[ 0 ], rs, abcs );
}

auto solve( long n, long[] rs, long[][] abcs )
{
	// ワーシャルフロイド法で最短距離を計算
	auto dss = new long[][]( n, n );
	foreach( i, ref ds; dss )
	{
		ds[] = long.max / 2;
		ds[ i ] = 0L;
	}
	foreach( ref abc; abcs )
	{
		abc[ 0 .. 2 ] -= 1;
		dss[ abc[ 0 ] ][ abc[ 1 ] ] = abc[ 2 ];
		dss[ abc[ 1 ] ][ abc[ 0 ] ] = abc[ 2 ];
	}
	foreach( i; 0L .. n )
	{
		foreach( j; 0 .. n )
		{
			foreach( k; 0 .. n )
			{
				dss[ i ][ j ] = min( dss[ i ][ j ], dss[ i ][ k ] + dss[ k ][ j ] );
			}
		}
	}
	
	// rsの順序を変えつつ最短距離を計算
	auto ans = long.max;
	rs[] -= 1;
	foreach( ps; rs.permutations )
	{
		auto dt = 0L;
		for( auto i = 0L; i + 1 < ps.length; i++ )
		{
			dt += dss[ ps[ i ] ][ ps[ i + 1 ] ];
		}
		ans = min( ans, dt );
	}
	return ans;
}
