#include <bits/stdc++.h>
using namespace std;
clock_t __START, __END;
double __TOTALTIME;
void _MS() { __START = clock(); }
void _ME() {
  __END = clock();
  __TOTALTIME = (double)(__END - __START) / CLOCKS_PER_SEC;
  cout << "Time: " << __TOTALTIME << " s" << endl;
}
const double E = 2.718281828;
const double PI = acos(-1.0);
const long long INF = (1LL << 40);
const int inf = (1 << 30);
const double ESP = 1e-9;
const int mod = (int)1e9 + 7;
const int N = (int)1e6 + 10;
int fa[N];
int Find(int xa) {
  int xb = xa;
  while (xa != fa[xa]) {
    xa = fa[xa];
  }
  while (xb != xa) {
    int temp = fa[xb];
    fa[xb] = xa;
    xb = temp;
  }
  return xa;
}
void combine(int a, int b) {
  int temp_a, temp_b;
  temp_a = Find(a);
  temp_b = Find(b);
  if (temp_a != temp_b) {
    if (temp_a < temp_b)
      fa[temp_b] = temp_a;
    else
      fa[temp_a] = temp_b;
  }
}
int id[N];
int sz[N], FA[N];
struct node {
  int u, v, c;
} way[N];
long long mp[505][505];
int main() {
  int n, m, k;
  scanf("%d%d%d", &n, &m, &k);
  int sum = 0;
  for (int i = 1; i <= n; ++i) fa[i] = i;
  for (int i = 1; i <= k; ++i) {
    scanf("%d", &sz[i]);
    for (int j = sum + 1; j <= sum + sz[i]; ++j) id[j] = i;
    sum += sz[i];
  }
  for (int i = 1; i <= m; ++i) {
    int u, v, c;
    scanf("%d%d%d", &u, &v, &c);
    way[i] = {u, v, c};
    if (c == 0) combine(u, v);
  }
  bool ok = 1;
  for (int i = 1; i <= n; ++i) {
    int ff = Find(i);
    if (FA[id[i]] == 0) {
      FA[id[i]] = ff;
      continue;
    }
    if (FA[id[i]] != ff) {
      ok = 0;
    }
  }
  if (!ok)
    printf("No\n");
  else {
    for (int i = 0; i < 505; ++i)
      for (int j = 0; j < 505; ++j) mp[i][j] = INF;
    for (int i = 0; i < 505; ++i) mp[i][i] = 0;
    for (int i = 1; i <= m; ++i) {
      if (id[way[i].u] != id[way[i].v])
        mp[id[way[i].v]][id[way[i].u]] = mp[id[way[i].u]][id[way[i].v]] =
            min(mp[id[way[i].u]][id[way[i].v]], (long long)way[i].c);
    }
    for (int o = 1; o <= k; o++)
      for (int i = 1; i <= k; i++)
        for (int j = 1; j <= k; j++)
          if (mp[i][j] > mp[i][o] + mp[o][j]) mp[i][j] = mp[i][o] + mp[o][j];
    printf("Yes\n");
    for (int i = 1; i <= k; ++i)
      for (int j = 1; j <= k; ++j)
        printf("%lld%c", mp[i][j] == INF ? -1 : mp[i][j], " \n"[j == k]);
  }
  return 0;
}
