#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 + 7;
int sp[N], c[N], w[N];
bool us[N], usBr[N], usSp[N];
int tin[N], valT[N], T;
struct edge {
  int v, w, num;
};
vector<edge> g[N];
int color[N];
vector<int> st, cmp[N];
int sz = 0;
void paint(int v) {
  int last = -1;
  while (!st.empty() && last != v) {
    int to = st.back();
    cmp[sz].push_back(to);
    color[to] = sz;
    last = to;
    st.pop_back();
  }
  ++sz;
}
void findBridges(int v, int p) {
  tin[v] = T++;
  us[v] = true;
  valT[v] = 1e9;
  st.push_back(v);
  for (edge e : g[v]) {
    int to = e.v;
    if (to == p) continue;
    if (us[to]) {
      valT[v] = min(valT[v], tin[to]);
    } else {
      findBridges(to, v);
      if (valT[to] > tin[v]) {
        usBr[e.num] = true;
        paint(to);
      }
      valT[v] = min(valT[v], valT[to]);
    }
  }
}
vector<pair<int, int>> gr[N];
long long dp[N];
int total, cnt[N];
void dfs(int v, int p) {
  for (int to : cmp[v]) {
    dp[v] += c[to];
  }
  cnt[v] = usSp[v];
  for (pair<int, int> e : gr[v]) {
    int to = e.first;
    int w = e.second;
    if (to == p) continue;
    dfs(to, v);
    long long val = max(0ll, dp[to] - w);
    if (!cnt[to] || cnt[to] == total) {
      val = max(val, dp[to]);
    }
    dp[v] += val;
    cnt[v] += cnt[to];
  }
}
void process_edge(int x, int y, int type, int weight) {
  long long val = max(0ll, dp[y] - weight);
  if (!cnt[y] || cnt[y] == total) {
    val = max(val, dp[y]);
  }
  dp[x] += type * val;
  cnt[x] += type * cnt[y];
}
void link(int x, int y, int w) { process_edge(x, y, 1, w); }
void cut(int x, int y, int w) { process_edge(x, y, -1, w); }
long long ans[N];
void findAns(int v, int p) {
  ans[v] = dp[v];
  for (pair<int, int> e : gr[v]) {
    int to = e.first;
    int w = e.second;
    if (to == p) continue;
    cut(v, to, w);
    link(to, v, w);
    findAns(to, v);
    cut(to, v, w);
    link(v, to, w);
  }
}
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  int n, m, k;
  cin >> n >> m >> k;
  for (int i = 0; i < k; ++i) {
    cin >> sp[i];
    --sp[i];
  }
  for (int i = 0; i < n; ++i) {
    cin >> c[i];
  }
  for (int i = 0; i < m; ++i) {
    cin >> w[i];
  }
  vector<pair<int, int>> edges;
  for (int i = 0; i < m; ++i) {
    int x, y;
    cin >> x >> y;
    --x;
    --y;
    edges.push_back({x, y});
    g[x].push_back({y, w[i], i});
    g[y].push_back({x, w[i], i});
  }
  findBridges(0, -1);
  paint(0);
  for (int i = 0; i < k; ++i) {
    usSp[color[sp[i]]] = true;
  }
  for (int i = 0; i < sz; ++i) {
    total += usSp[i];
  }
  for (int i = 0; i < m; ++i) {
    if (usBr[i]) {
      int x = color[edges[i].first];
      int y = color[edges[i].second];
      gr[x].push_back({y, w[i]});
      gr[y].push_back({x, w[i]});
    }
  }
  dfs(0, -1);
  findAns(0, -1);
  for (int i = 0; i < n; ++i) {
    cout << ans[color[i]] << ' ';
  }
}
