#include<iostream>
#include<fstream>
#define DN 10005
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");

int n, m, d[2001][DN], ks[DN], k, l=0;

struct nod
{
	int nod1, nod2, c;
	nod *urm;
}*a[2001], *p;

void creare(int x, int y, int cost)
{
	nod *q=new nod;
	q->nod1=x;
	q->nod2=y;
	q->c=cost;
	q->urm=a[1];
	a[1]=q;
}

int main()
{
	int i,j, ok=1,x,y,z;
	fin>>n>>m>>k;
	for(i=1;i<=n;i++)
		for(j=2;j<=n;j++)
		d[i][j]=999999;
	
	for(i=1;i<=k;i++)
		fin>>ks[i];
	
	for(i=1;i<=m;i++)
	{
		fin>>x>>y>>z;
		creare(x,y,z);
		if(x==1)
			d[x][y]=z;
	}
	for(int i=1;i<=n;i++)
	{
		ok=1;
		while(ok)
		{
			p=a[i];ok=0;
			while(p)
			{
				if(d[i][p->nod2]>d[i][p->nod1]+p->c)
				{	
					d[i][p->nod2]=d[i][p->nod1]+p->c; ok=1;
					
				}
				p=p->urm;
			}
		}
	}
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
			cout<<d[i][j]<<" ";
		cout<<endl;
	}
	if(k==0)
		fout<<d[1][n];
	else
	{
		for(i=1;i<=k;i++)
		{
			l+=d[j][ks[i]];
			j=ks[i];
		}
		fout<<l;
	}
}
