#include <bits/stdc++.h>
using namespace std;
const int N = 100001, inf = 1000000009;
int cc[N], x, y;
vector<pair<int, int> > g[N];
int a[501][501];
int d[N], n, m, k, cost;
int main() {
  cin >> n >> m >> k;
  for (int i = 1; i <= k; ++i)
    for (int j = 1; j <= k; ++j)
      if (i != j) a[i][j] = inf;
  for (int i = 1; i <= n; ++i) d[i] = inf;
  int last = 0;
  for (int i = 1; i <= k; ++i) {
    cin >> x;
    for (int j = last + 1; j <= last + x; ++j) cc[j] = i;
    last += x;
  }
  for (int i = 1; i <= m; ++i) {
    cin >> x >> y >> cost;
    g[x].push_back(make_pair(y, cost));
    g[y].push_back(make_pair(x, cost));
    a[cc[x]][cc[y]] = min(cost, a[cc[x]][cc[y]]);
    a[cc[y]][cc[x]] = min(cost, a[cc[y]][cc[x]]);
  }
  for (int i = 1; i <= n; ++i)
    if (cc[i] != cc[i - 1]) {
      int v = i;
      d[v] = 0;
      set<pair<int, int> > st;
      st.insert(make_pair(d[v], v));
      while (!st.empty()) {
        int v = st.begin()->second;
        st.erase(st.begin());
        for (int j = 0; j < g[v].size(); ++j) {
          if (d[g[v][j].first] > d[v] + g[v][j].second) {
            st.erase(make_pair(d[g[v][j].first], g[v][j].first));
            d[g[v][j].first] = d[v] + g[v][j].second;
            st.insert(make_pair(d[g[v][j].first], g[v][j].first));
          }
        }
      }
    }
  for (int i = 1; i <= n; ++i)
    if (d[i] != 0) {
      cout << "No";
      return 0;
    }
  for (int z = 1; z <= k; ++z)
    for (int i = 1; i <= k; ++i)
      for (int j = 1; j <= k; ++j)
        if (a[i][j] > a[i][z] + a[z][j]) a[i][j] = a[i][z] + a[z][j];
  cout << "Yes\n";
  for (int i = 1; i <= k; ++i) {
    for (int j = 1; j <= k; ++j) {
      if (a[i][j] != inf)
        cout << a[i][j] << " ";
      else
        cout << -1 << " ";
    }
    cout << "\n";
  }
  return 0;
}
