#include <bits/stdc++.h>
using namespace std;
int mat[555][555] = {0};
int par[100009] = {0};
int grp[100009] = {0};
int arr[555] = {0};
int find(int pos) {
  if (par[pos] == pos) return pos;
  par[pos] = find(par[pos]);
  return par[pos];
}
int mx = 1000001233;
int main() {
  int n, m, i, j, k, l;
  cin >> n >> m >> k;
  for (i = 1; i <= k; i++) cin >> arr[i];
  for (i = 1; i <= k; i++) {
    for (j = 1; j <= k; j++) {
      mat[i][j] = mx;
    }
  }
  for (i = 1; i <= n; i++) par[i] = i;
  l = 1;
  for (i = 1; i <= k; i++) {
    for (j = 1; j <= arr[i]; j++) {
      grp[l] = i;
      l++;
    }
  }
  int u, v, x, a, b;
  while (m--) {
    cin >> u >> v >> x;
    if (x == 0) {
      a = find(u);
      b = find(v);
      if (a != b) par[a] = b;
    }
    a = grp[u];
    b = grp[v];
    mat[a][b] = min(mat[a][b], min(x, mat[b][a]));
    mat[b][a] = mat[a][b];
  }
  l = 1;
  int ck = 2;
  for (i = 1; i <= k; i++) {
    u = find(l);
    l++;
    for (j = 2; j <= arr[i]; j++) {
      if (u != find(l)) {
        ck = 3;
        cout << "No" << endl;
        return 0;
      }
      l++;
    }
    mat[i][i] = 0;
  }
  for (i = 1; i <= k; i++) {
    if (mat[i][i] != 0 && arr[i] > 1) {
      cout << "No" << endl;
      return 0;
    }
    if (arr[i] == 1) mat[i][i] = 0;
  }
  cout << "Yes" << endl;
  for (l = 1; l <= k; l++) {
    for (i = 1; i <= k; i++) {
      for (j = 1; j <= k; j++) {
        mat[i][j] = min(mat[i][j], (mat[i][l] + mat[l][j]));
      }
    }
  }
  for (i = 1; i <= k; i++) {
    for (j = 1; j <= k; j++) {
      if (mat[i][j] == mx)
        cout << -1 << " ";
      else
        cout << mat[i][j] << " ";
    }
    cout << endl;
  }
  return 0;
}
