//Author:ZhuHua14(luogu)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 2e4 + 5;
const int MAXM = 2e6 + 5;
const int MAXK = 15;

struct Edge{
	int u,v,w;
};
Edge edge[MAXM];
bool cmp(Edge x,Edge y){
	return x.w < y.w;
}

struct Node{
	int pay1,pay[MAXN];
};
Node node[MAXK];

int n,m,k;

//k == 0 20pts at14:50���� 
int fa[MAXN],cnt;

int find(int x){
	return (fa[x] == x) ? x : (fa[x] = find(fa[x]));
}

bool merge(int a,int b){
	int faa = find(a),fab = find(b);
	if(faa != fab){
		fa[faa] = fab;
		return 1;
	}
	else return 0;
}

void init(){
	for(int i = 1; i <= n + 2 * k; i++){
		fa[i] = i;
	}
}

//trick1: �������壬�����ǳ��У��൱����c_j�Ĵ��ۿ���һ���м̵㣨ֻ��10���� �����м̵����м̵�֮���ǲ���ͨ�� 
//trick2: ֻҪ�õ��м̵� �м̵��ȻҲ����С�������� 
//������ͼ���������м̵�ı����в�ͨ��
//������԰Ѵ��Ӳ�����㴦����������֮��ı�Ȩ��c_j
//����������ı�ֻ��һ����֤��������ò��ţ�ɾ�������ߵı�Ȩ�������ĵ�Ȩ�ͺ���,���1e5���ߺ�20���㡣 
//����һ������д�����
//18:12 ����������ˣ����ſ����ܲ���ƭ��֣� �������Ƿֿ�д�ģ� 
 
void solve1(){
	sort(edge + 1,edge + 1 + n,cmp);
	ll ans = 0;
	init();
	for(int i = 1; i <= m; i++){
		if(merge(edge[i].u,edge[i].v)){
//			 << edge[i].u << ' ' << edge[i].v;
			ans += edge[i].w;
			cnt++;
		}
		if(cnt == n) break;
	}
	cout << ans << '\n';
}

//fake 
int ind[MAXK],lstp[MAXK];
void init2(){
	//(n + i��n + k + i)��Ӧ��i���� 
	for(int i = 1; i <= k; i++){
		edge[++m] = {n + i,n + i + k,node[i].pay1};
		for(int j = 1; j <= n; j++){
			edge[++m] = {j,n + i + 1,node[i].pay[j]};
		} 
	} 
	sort(edge + 1,edge + 1 + m,cmp);
	ll ans = 0;
	init();
	for(int i = 1; i <= m; i++){
		if(merge(edge[i].u,edge[i].v)){
			//cerr << edge[i].u << ' ' << edge[i].v << '\n';
			if(edge[i].v > n && edge[i].u <= n){
				ind[edge[i].v]++;
				lstp[edge[i].v] = edge[i].u;
			}
			ans += edge[i].w;
			cnt++;
		}
		if(cnt == n + 2 * k) break;
	}
	for(int i = 1; i <= k; i++){
		if(ind[i] == 1){
			ans -= node[i].pay[lstp[i]];
			ans -= node[i].pay1;
		}
	}
	cout << ans << '\n';
} 

void solve2(){
	init2();
} 

int main(){
	freopen("road.in","r",stdin);
	freopen("road.out","w",stdout);
//	freopen("road1.in","r",stdin);
//	freopen("road.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m >> k;
	for(int i = 1; i <= m; i++){
		cin >> edge[i].u >> edge[i].v >> edge[i].w;
	}
	for(int i = 1; i <= k; i++){
		cin >> node[i].pay1;
		for(int j = 1; j <= n; j++){
			cin >> node[i].pay[j];
		}
	}
	if(k == 0) solve1();
	else solve2();
	return 0;
}

