#include <bits/stdc++.h>
using namespace std;
const int N = -1;
const int INF = 1.01e9;
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  vector<long long> c(n);
  for (int i = 0; i < n; i++) {
    scanf("%lld", &c[i]);
  }
  vector<vector<pair<int, int>>> e(n);
  for (int i = 0; i < m; i++) {
    int v, u;
    scanf("%d%d", &v, &u);
    v--;
    u--;
    e[v].push_back({u, i});
    e[u].push_back({v, i});
  }
  vector<int> odd;
  vector<int> color(n, -1);
  int V = -1;
  vector<pair<int, int>> st;
  function<void(int, int, int)> dfs0 = [&](int v, int eid, int cc) {
    st.push_back({v, eid});
    color[v] = cc;
    for (auto x : e[v]) {
      int u = x.first;
      if (color[u] == -1) {
        dfs0(u, x.second, cc ^ 1);
        if (!odd.empty()) return;
      } else {
        if (color[u] != (cc ^ 1)) {
          odd.push_back(x.second);
          for (int j = st.size() - 1; st[j].first != u; j--) {
            odd.push_back(st[j].second);
          }
          V = u;
          return;
        }
      }
    }
    st.pop_back();
  };
  dfs0(0, -1, 0);
  vector<long long> answer(m);
  vector<int> used(n);
  function<void(int)> dfs1 = [&](int v) {
    used[v] = 1;
    for (auto x : e[v]) {
      int u = x.first;
      if (!used[u]) {
        dfs1(u);
        long long y = c[u];
        c[v] -= y;
        c[u] -= y;
        answer[x.second] += y;
      }
    }
  };
  if (V == -1) {
    V = 0;
  }
  dfs1(V);
  if (c[V] != 0) {
    if (odd.empty()) {
      puts("NO");
      return 0;
    }
    assert(c[V] % 2 == 0);
    assert(odd.size() % 2 == 1);
    long long add = c[V] / 2;
    for (int i = 0; i < (int)odd.size(); i++) {
      if (i % 2 == 1) {
        answer[odd[i]] -= add;
      } else {
        answer[odd[i]] += add;
      }
    }
  }
  puts("YES");
  for (auto x : answer) {
    printf("%lld\n", x);
  }
  return 0;
}
