//by OldDriverTree
#include<bits/stdc++.h>
#define range(vec) vec.begin(),vec.end()
#define tup array<int,3>
#define P pair<int,int>
#define int long long
#define mid (l+r>>1)
using namespace std;
const int N=10011,M=1e6,K=10;
int n,m,k,tot,ans,fa[N],a[K][N];
tup e[M],E[M]; bool st[M];

int read() {
	int x=0; bool f=true; char c=0;
	while (!isdigit(c) ) f&=(c!='-'),c=getchar();
	while (isdigit(c) ) x=x*10+(c&15),c=getchar();
	return f?x:-x;
}
int find(int x) {
	return fa[x]^x?fa[x]=find(fa[x]):x; 	
}
main()
{
	freopen("road.in","r",stdin);
	freopen("road.out","w",stdout);
	n=read(),m=read(),k=read(),ans=LLONG_MAX;
	for (int i=0;i<m;i++) e[i]={read(),read(),read()};
	for (int i=0;i<k;i++)
		for (int j=0;j<=n;j++)
			a[i][j]=read();
	
	for (int i=1;i<=n;i++) fa[i]=i;
	sort(e,e+m,[&](tup x,tup y){ return x[2]<y[2]; });
	for (int i=0;i<m;i++)
		if (find(e[i][0])^find(e[i][1]) )
			fa[find(e[i][0])]=find(e[i][1]),st[i]=true;
	
	for (int i=0;i<m;i++)
	if (st[i]) E[tot++]=e[i];
	for (int S=0;S<1<<k;S++)
	{
		int res=0;
		for (int i=1;i<=n+k;i++) fa[i]=i;
		for (int i=0;i<n-1;i++) e[i]=E[i]; tot=n-1;
		for (int i=0;i<k;i++) if (S>>i&1) {
			res+=a[i][0]; for (int j=1;j<=n;j++)
			e[tot++]={j,n+i+1,a[i][j]};
		}
		sort(e,e+tot,[&](tup x,tup y){ return x[2]<y[2]; });
		for (int i=0;i<tot&&res<ans;i++) if (find(e[i][0])^find(e[i][1]) )
		res+=e[i][2],fa[find(e[i][0])]=find(e[i][1]); ans=min(ans,res);
	}
	printf("%lld",ans); 
	return 0;
}
/*
k=0 �� A �����Ǽ򵥵ģ�����С������
��չ��û�� A ���ʣ� ����Ҫ������ kruskal �Ĵ�����ÿ�εı��� 
����˵�������ܲ�����ǰ��һЩ��������ɾ��  
���ڲ���ԭͼ��С�������ϵıߣ�����û�õ�
 O(mlog m+n2^k*k)��ŶŶŶ 
 15:52 �����˴����������Ǵ�������ôû�� n=1e4 
 ����һ�� n=1e4������ 3.5s����ʼ���� 
 ����������һ�� 
*/ 
