#include <bits/stdc++.h>
using namespace std;
struct node {
  long long x, y, next, w;
} a[660000], tr[660000];
long long last[660000], last_tr[660000];
long long c[660000], w[660000];
long long site[660000];
long long n, m, k, len = 0, ans = 0;
long long x, y, sum = 0;
long long low[660000], dfn[660000], cnt = 0;
bool bridge[660000];
long long block[660000], dcc = 0;
long long vis[660000];
long long val[660000], special[660000];
long long f[660000], g[660000], dp[660000], special_sub[660000];
void add(long long x, long long y) {
  a[len].x = x;
  a[len].y = y;
  a[len].next = last[x];
  last[x] = len;
  len++;
  return;
}
void add_tr(long long x, long long y, long long w) {
  tr[len].x = x;
  tr[len].y = y;
  tr[len].w = w;
  tr[len].next = last_tr[x];
  last_tr[x] = len;
  len++;
  return;
}
void tarjan(long long x, long long in_edge) {
  dfn[x] = low[x] = ++cnt;
  for (long long i = last[x]; i + 1; i = a[i].next) {
    long long y = a[i].y;
    if (!dfn[y]) {
      tarjan(y, i);
      low[x] = min(low[x], low[y]);
      if (low[y] > low[x]) bridge[i] = bridge[i ^ 1] = true;
    } else if (i != (in_edge ^ 1))
      low[x] = min(low[x], dfn[y]);
  }
  return;
}
void dfs(long long x, long long color) {
  block[x] = color;
  for (long long i = last[x]; i + 1; i = a[i].next) {
    long long y = a[i].y;
    if (bridge[i]) continue;
    if (!block[y]) dfs(y, color);
  }
  return;
}
void get_edccs() {
  for (long long i = 1; i <= n; i++) {
    if (!block[i]) dfs(i, ++dcc);
  }
  return;
}
void finda(long long u, long long fa) {
  if (special[u]) special_sub[u] += 1;
  for (long long k = last_tr[u]; k + 1; k = tr[k].next) {
    long long v = tr[k].y;
    if (v == fa) continue;
    finda(v, u);
    special_sub[u] += special_sub[v];
  }
  for (long long k = last_tr[u]; k + 1; k = tr[k].next) {
    long long v = tr[k].y;
    if (v == fa) continue;
    if (special_sub[v] == 0 || special_sub[v] == sum)
      f[u] += f[v];
    else
      f[u] += max(0LL, f[v] - tr[k].w);
  }
  f[u] += val[u];
  return;
}
void findb(long long u, long long fa) {
  long long num = 0;
  for (long long k = last_tr[u]; k + 1; k = tr[k].next) {
    long long v = tr[k].y;
    if (v == fa) continue;
    if (special_sub[v] == 0 || special_sub[v] == sum)
      num += f[v];
    else
      num += max(0LL, f[v] - tr[k].w);
  }
  for (long long k = last_tr[u]; k + 1; k = tr[k].next) {
    long long v = tr[k].y;
    if (v == fa) continue;
    if (special_sub[v] == 0 || special_sub[v] == sum)
      g[v] = g[u] + val[u] + num - f[v];
    else
      g[v] =
          max(0LL, g[u] + val[u] + (num - max(0LL, f[v] - tr[k].w)) - tr[k].w);
    findb(v, u);
  }
  return;
}
int main() {
  scanf("%lld%lld%lld", &n, &m, &k);
  memset(bridge, false, sizeof(bridge));
  memset(last, -1, sizeof(last));
  memset(last_tr, -1, sizeof(last_tr));
  for (long long i = 1; i <= k; i++) {
    scanf("%lld", &x);
    site[x] = 1;
  }
  for (long long i = 1; i <= n; i++) scanf("%lld", &c[i]);
  for (long long i = 1; i <= m; i++) scanf("%lld", &w[i]);
  for (long long i = 1; i <= m; i++) {
    scanf("%lld%lld", &x, &y);
    add(x, y);
    add(y, x);
  }
  tarjan(1, 0);
  get_edccs();
  len = 0;
  for (long long i = 1; i <= n; i++) {
    val[block[i]] += c[i];
    if (site[i]) special[block[i]] = 1;
  }
  for (long long i = 0; i < 2 * m; i++) {
    if (bridge[i]) {
      if (block[a[i].x] != block[a[i].y])
        add_tr(block[a[i].x], block[a[i].y], w[i / 2 + 1]);
    }
  }
  for (long long i = 1; i <= dcc; i++)
    if (special[i]) sum++;
  finda(1, 0);
  findb(1, 0);
  for (long long i = 1; i <= dcc; i++) dp[i] = f[i] + g[i];
  for (long long i = 1; i <= n; i++) printf("%lld ", dp[block[i]]);
  return 0;
}
