#include <bits/stdc++.h>
using namespace std;
const int N = 300005;
int n, m, k, x, inq[N];
int vis[N], co[N], w[N];
int dfn[N], ed[N], low[N];
int fa[N], be[N], stk[N];
vector<pair<int, int> > e[N];
void tarjan(int x) {
  dfn[x] = low[x] = ++*dfn;
  stk[++*stk] = x;
  inq[x] = 1;
  for (auto i : e[x])
    if (i.first != fa[x]) {
      if (!dfn[i.first]) {
        fa[i.first] = x;
        tarjan(i.first);
        low[x] = min(low[x], low[i.first]);
      } else if (inq[i.first])
        low[x] = min(low[x], dfn[i.first]);
    }
  if (low[x] == dfn[x]) {
    ++*be;
    int y = 19260817;
    for (; y != x;) {
      y = stk[(*stk)--];
      be[y] = *be;
      inq[y] = 0;
    }
  }
}
namespace TREE {
int nvis[N], fa[N];
int spe[N], faid[N], bel[N];
long long nco[N], f[N], g[N];
long long sf[N], sg[N], res[N];
vector<pair<int, int> > ne[N];
void dfs(int x) {
  sf[x] = nco[x];
  if (nvis[x]) spe[x] = 1;
  for (auto i : ne[x])
    if (i.first != fa[x]) {
      fa[i.first] = x;
      faid[i.first] = i.second;
      dfs(i.first);
      nvis[x] += nvis[i.first];
      sf[x] += sf[i.first];
      if (nvis[i.first] && nvis[i.first] != k) spe[x] = 1;
    }
}
void dfs1(int x) {
  long long sum = sg[x] + sf[x];
  if (spe[x]) bel[x] = x;
  for (auto i : ne[x])
    if (i.first != fa[x]) {
      bel[i.first] = bel[x];
      sg[i.first] = sum - sf[i.first];
      dfs1(i.first);
    }
}
void dfs2(int x) {
  for (auto i : ne[x])
    if (i.first != fa[x]) {
      dfs2(i.first);
      if (spe[i.first])
        f[x] += f[i.first];
      else
        f[x] += sf[i.first];
    }
  f[x] = max(0ll, f[x] + nco[x] - w[faid[x]]);
}
void dfs3(int x) {
  long long sum = g[x];
  for (auto i : ne[x])
    if (i.first != fa[x])
      if (spe[i.first])
        sum += f[i.first];
      else
        sum += sf[i.first];
  for (auto i : ne[x])
    if (i.first != fa[x]) {
      g[i.first] = sum;
      if (spe[i.first])
        g[i.first] -= f[i.first];
      else
        g[i.first] -= sf[i.first];
      g[i.first] = max(0ll, g[i.first] + nco[x] - w[i.second]);
      dfs3(i.first);
    }
}
void init() {
  for (int i = (int)(1); i <= (int)(n); i++) {
    nco[be[i]] += co[i];
    nvis[be[i]] += vis[i];
    for (auto j : e[i])
      if (be[j.first] != be[i]) {
        ne[be[i]].push_back(pair<int, int>(be[j.first], j.second));
      }
  }
  int p = -1;
  for (int i = (int)(1); i <= (int)(*be); i++)
    if (nvis[i]) p = i;
  dfs(p);
  dfs1(p);
  dfs2(p);
  dfs3(p);
  for (int i = (int)(1); i <= (int)(*be); i++)
    if (spe[i]) {
      res[i] = nco[i];
      for (auto j : ne[i])
        if (spe[j.first])
          res[i] += (j.first == fa[i] ? g[i] : f[j.first]);
        else
          res[i] += (j.first == fa[i] ? sg[i] : sf[j.first]);
    }
}
long long query(int x) { return res[bel[x]]; }
}  // namespace TREE
int main() {
  scanf("%d%d%d", &n, &m, &k);
  for (int i = (int)(1); i <= (int)(k); i++) scanf("%d", &x), vis[x] = 1;
  for (int i = (int)(1); i <= (int)(n); i++) scanf("%d", &co[i]);
  for (int i = (int)(1); i <= (int)(m); i++) scanf("%d", &w[i]);
  for (int i = (int)(1); i <= (int)(m); i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    e[x].push_back(pair<int, int>(y, i));
    e[y].push_back(pair<int, int>(x, i));
  }
  tarjan(1);
  TREE::init();
  for (int i = (int)(1); i <= (int)(n); i++)
    printf("%lld\n", TREE::query(be[i]));
}
