#include <bits/stdc++.h>
using namespace std;
long long n, m, k;
long long c[510];
long long sumc[510];
long long dist[510][510];
long long cc;
vector<pair<long long, long long> > v0;
vector<pair<long long, pair<long long, long long> > > v1;
long long pt[100010];
long long rnk[100010];
long long findpt(long long x) {
  if (pt[x] == x) return x;
  return pt[x] = findpt(pt[x]);
}
void add(long long indx) {
  long long x = v0[indx].first;
  long long y = v0[indx].second;
  long long ptx = findpt(x);
  long long pty = findpt(y);
  if (ptx == pty) return;
  cc--;
  if (rnk[ptx] == rnk[pty]) {
    rnk[ptx]++;
  }
  if (rnk[ptx] < rnk[pty]) {
    pt[ptx] = pty;
  } else {
    pt[pty] = ptx;
  }
}
long long comp(long long x) {
  long long st = 0;
  long long en = k;
  long long mid;
  long long ans = -1;
  while (st <= en) {
    mid = (st + en) / 2;
    if (sumc[mid] >= x) {
      en = mid - 1;
    } else {
      ans = mid;
      st = mid + 1;
    }
  }
  return ans + 1;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m >> k;
  sumc[0] = 0;
  cc = n;
  for (long long i = 0; i < k; i++) {
    cin >> c[i];
    sumc[i + 1] = sumc[i] + c[i];
  }
  for (long long i = 0; i < m; i++) {
    long long a, b, c;
    cin >> a >> b >> c;
    long long x = comp(a);
    long long y = comp(b);
    if (c == 0) {
      v0.push_back({a, b});
    }
    if (x != y) {
      v1.push_back({c, {x, y}});
    }
  }
  for (long long i = 0; i <= n; i++) {
    pt[i] = i;
    rnk[i] = 0;
  }
  for (long long i = 0; i < v0.size(); i++) {
    add(i);
  }
  int cur = -1;
  int j = 1;
  for (int i = 1; i <= n;) {
    cur = findpt(i);
    while (i <= sumc[j]) {
      if (findpt(i) != cur) {
        cout << "No" << endl;
        return 0;
      }
      i++;
    }
    j++;
  }
  cout << "Yes" << endl;
  for (long long i = 1; i <= k; i++) {
    for (long long l = 1; l <= k; l++) {
      if (l == i)
        dist[i][l] = 0;
      else
        dist[i][l] = 1e15;
    }
  }
  for (long long i = 0; i < v1.size(); i++) {
    dist[v1[i].second.first][v1[i].second.second] =
        min(v1[i].first, dist[v1[i].second.first][v1[i].second.second]);
    dist[v1[i].second.second][v1[i].second.first] =
        min(v1[i].first, dist[v1[i].second.second][v1[i].second.first]);
  }
  for (long long kk = 1; kk <= k; kk++) {
    for (long long i = 1; i <= k; i++) {
      for (long long l = 1; l <= k; l++) {
        dist[i][l] = min(dist[i][l], dist[i][kk] + dist[kk][l]);
      }
    }
  }
  for (long long i = 1; i <= k; i++) {
    for (long long l = 1; l <= k; l++) {
      if (dist[i][l] >= 1e15)
        cout << -1 << " ";
      else
        cout << dist[i][l] << " ";
    }
    cout << endl;
  }
  return 0;
}
