#include <bits/stdc++.h>
using namespace std;
const long long int INF = 1e18;
const long long int inf = 1e9;
const long long int MOD = 1e9 + 7;
const long long int nax = 1000000 + 10;
int n, m, k, arr[nax], reali[nax];
int graph[501][501];
int p[nax], s[nax];
int findi(int a) {
  int a1 = a;
  while (a != p[a]) a = p[a];
  return p[a1] = a;
}
bool same(int a, int b) { return findi(a) == findi(b); }
void unioni(int a, int b) {
  a = findi(a);
  b = findi(b);
  if (s[a] < s[b]) swap(a, b);
  s[a] += s[b];
  p[b] = a;
}
void init() {
  for (int i = 1; i <= n; i++) s[i] = 1, p[i] = i;
  for (int i = 1; i <= k; i++) {
    for (int j = 1; j <= k; j++) {
      if (i == j)
        graph[i][j] = 0;
      else
        graph[i][j] = inf;
    }
  }
}
int main() {
  cin >> n >> m >> k;
  for (int i = 1; i <= k; i++) cin >> arr[i];
  int from = 0;
  int to = 0;
  init();
  for (int i = 1; i <= k; i++) {
    to += arr[i];
    for (int j = from + 1; j <= to; j++) {
      reali[j] = i;
    }
    from = to;
  }
  while (m--) {
    int u, v, w;
    cin >> u >> v >> w;
    if (w == 0) {
      if (!same(u, v)) unioni(u, v);
    }
    if (reali[u] != reali[v]) {
      graph[reali[u]][reali[v]] = min(graph[reali[u]][reali[v]], w);
      graph[reali[v]][reali[u]] = min(graph[reali[v]][reali[u]], w);
    }
  }
  from = 0;
  to = 0;
  int flag = 0;
  for (int i = 1; i <= k; i++) {
    to += arr[i];
    int tocheck = from + 1;
    for (int j = tocheck + 1; j <= to; j++)
      if (same(tocheck, j) == false) flag = 1;
    from = to;
  }
  if (flag == 1) {
    cout << "No";
    return 0;
  }
  cout << "Yes" << endl;
  for (int z = 1; z <= k; z++) {
    for (int i = 1; i <= k; i++) {
      for (int j = 1; j <= k; j++) {
        graph[i][j] = min(graph[i][j], graph[i][z] + graph[z][j]);
      }
    }
  }
  for (int i = 1; i <= k; i++) {
    for (int j = 1; j <= k; j++) {
      if (graph[i][j] == inf)
        cout << -1;
      else
        cout << graph[i][j];
      cout << " ";
    }
    cout << endl;
  }
  return 0;
}
