#include <bits/stdc++.h>
using namespace std;
int n, m;
long long c[110000];
long long ans[110000];
vector<long long> edge[110000];
vector<long long> edges;
int u, v;
bool come[110000];
long long dep[110000];
long long parent[110000];
long long odd = -1;
long long odd_a, odd_b;
void dfs(int x) {
  come[x] = true;
  for (auto e : edge[x]) {
    int to = edges[e] - x;
    if (come[to]) {
      if ((dep[x] - dep[to]) % 2 == 0) {
        odd = e;
        odd_a = x;
        odd_b = to;
      }
      continue;
    }
    dep[to] = dep[x] + 1;
    parent[to] = x;
    dfs(to);
    ans[e] += c[to];
    c[x] -= c[to];
    c[to] = 0;
  }
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; i++) cin >> c[i];
  for (int i = 0; i < m; i++) {
    scanf("%d%d", &u, &v);
    u--, v--;
    edges.push_back(u + v);
    edge[u].push_back(i);
    edge[v].push_back(i);
  }
  dfs(0);
  if (odd == -1 && c[0] != 0) {
    cout << "NO" << endl;
    return 0;
  }
  if (odd == -1) {
    cout << "YES" << endl;
    for (int i = 0; i < m; i++) printf("%lld\n", ans[i]);
    return 0;
  }
  long long ex = c[0] / 2;
  if (dep[odd_a] % 2 == 1) ex = -ex;
  ans[odd] += ex;
  c[odd_a] -= ex;
  c[odd_b] -= ex;
  fill(come, come + n, false);
  dfs(0);
  cout << "YES" << endl;
  for (int i = 0; i < m; i++) printf("%lld\n", ans[i]);
  return 0;
}
