#include <bits/stdc++.h>
using namespace std;
long long powe(long long a, long long b) {
  if (b == 0) return 1;
  long long ans = powe(a, b / 2);
  ans *= ans;
  if (ans >= 1000000007) {
    ans %= 1000000007;
  }
  if (b & 1) ans *= 2;
  return ans;
}
long long swap(long long& x, long long& y) {
  long long temp = x;
  x = y;
  y = temp;
}
bool vis[100010];
vector<pair<long long, long long> > adj[100010];
vector<long long> zerov[100010];
inline void BFS(long long x) {
  vis[x] = true;
  queue<long long> Q;
  Q.push(x);
  long long top, i;
  while (!Q.empty()) {
    top = Q.front();
    if (x == 2) {
    }
    for (i = 0; i < zerov[top].size(); i++) {
      long long index = zerov[top][i];
      if (vis[index] == true) {
        continue;
      }
      Q.push(index);
      vis[index] = true;
    }
    Q.pop();
  }
  return;
}
long long c[600];
long long type[100010];
long long arr[600][600];
long long solve() {
  long long n, m, k, i, j, x;
  cin >> n >> m >> k;
  long long prev = 0;
  for (i = 1; i <= k; i++) {
    cin >> c[i];
    x = c[i];
    for (j = prev + 1; j <= prev + x; j++) {
      type[j] = i;
    }
    prev += x;
  }
  long long y, co;
  for (i = 0; i < m; i++) {
    cin >> x >> y >> co;
    adj[x].push_back(make_pair(y, co));
    adj[y].push_back(make_pair(x, co));
  }
  for (i = 1; i <= n; i++) {
    for (j = 0; j < adj[i].size(); j++) {
      if (adj[i][j].second == 0) {
        zerov[i].push_back(adj[i][j].first);
        zerov[adj[i][j].first].push_back(i);
      }
    }
  }
  for (i = 1; i <= k; i++) {
    long long sum = 0;
    for (long long j = 1; j < i; j++) {
      sum += c[j];
    }
    for (long long j = 1; j <= n; j++) {
      vis[j] = false;
    }
    BFS(sum + 1);
    for (j = sum + 1; j <= sum + c[i]; j++) {
      if (!vis[j]) {
        cout << "No" << endl;
        return 0;
      }
    }
  }
  for (i = 1; i <= k + 1; i++) {
    for (j = 1; j <= k + 1; j++) {
      arr[i][j] = 1200010000;
    }
    arr[i][i] = 0;
  }
  for (long long i = 1; i <= n; i++) {
    for (long long j = 0; j < adj[i].size(); j++) {
      x = type[i];
      y = type[adj[i][j].first];
      arr[x][y] = min(arr[x][y], adj[i][j].second);
      arr[y][x] = arr[x][y];
    }
  }
  for (long long index = 1; index <= k; index++) {
    for (i = 1; i <= k; i++) {
      for (j = 1; j <= k; j++) {
        arr[i][j] = min(arr[i][j], arr[i][index] + arr[index][j]);
      }
    }
  }
  cout << "Yes" << endl;
  for (i = 1; i <= k; i++) {
    for (j = 1; j <= k; j++) {
      if (arr[i][j] == 1200010000) {
        cout << -1;
      } else {
        cout << arr[i][j];
      }
      cout << " ";
    }
    cout << endl;
  }
}
int main() {
  long long test = 1;
  while (test--) {
    solve();
  }
}
