#include <bits/stdc++.h>
int C[100005], D[505][505], L[100005], R[100005], Par[100005];
int N, K, M;
using namespace std;
int find(int n) {
  if (Par[n] == n)
    return n;
  else
    return Par[n] = find(Par[n]);
}
void join(int a, int b) { Par[find(a)] = find(b); }
int main() {
  cin >> N >> M >> K;
  for (int i = 1; i <= K; i++) {
    int x;
    cin >> x;
    L[i] = R[i - 1] + 1;
    R[i] = L[i] + x - 1;
    for (int p = L[i]; p <= R[i]; p++) C[p] = i;
  }
  for (int i = 1; i <= N; i++) Par[i] = i;
  for (int i = 1; i <= K; i++) {
    for (int j = 1; j <= K; j++) D[i][j] = 1000000005;
    D[i][i] = 0;
  }
  while (M--) {
    int a, b, d;
    cin >> a >> b >> d;
    if (d == 0) join(a, b);
    D[C[a]][C[b]] = min(D[C[a]][C[b]], d);
    D[C[b]][C[a]] = min(D[C[b]][C[a]], d);
  }
  for (int i = 1; i <= K; i++)
    for (int p = L[i]; p <= R[i]; p++)
      if (find(p) != find(L[i])) {
        cout << "No";
        return 0;
      }
  for (int k = 1; k <= K; k++)
    for (int i = 1; i <= K; i++)
      for (int j = 1; j <= K; j++) D[i][j] = min(D[i][j], D[i][k] + D[k][j]);
  cout << "Yes\n";
  for (int i = 1; i <= K; i++) {
    for (int j = 1; j <= K; j++) {
      if (D[i][j] < 1000000005)
        cout << D[i][j] << " ";
      else
        cout << "-1 ";
    }
    cout << "\n";
  }
}
