#include <bits/stdc++.h>
using namespace std;
long long sum[2];
int n, m;
int x, y, color[100100], root;
long long c[100100], a[100100];
long long ans[100100];
pair<int, int> to;
vector<pair<int, int> > g[100100], p[100100];
void Draw(int x) {
  for (int i = 0; i < g[x].size(); i++) {
    int v = g[x][i].first;
    if (color[v] != -1) {
      if (color[v] == color[x]) root = x, to = g[x][i];
      continue;
    }
    color[v] = !color[x];
    p[x].push_back(g[x][i]);
    p[v].push_back(make_pair(x, g[x][i].second));
    sum[color[v]] += a[v];
    Draw(v);
  }
}
void Print(int x, int from, int fa) {
  c[x] = a[x];
  for (int i = 0; i < p[x].size(); i++) {
    int v = p[x][i].first, o = p[x][i].second;
    if (v == fa) continue;
    Print(v, o, x);
    c[x] -= ans[o];
  }
  ans[from] = c[x];
}
int main(void) {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) scanf("%lld", &a[i]);
  for (int i = 1; i <= m; i++) {
    scanf("%d%d", &x, &y);
    g[x].push_back(make_pair(y, i));
    g[y].push_back(make_pair(x, i));
  }
  memset(color, 0xff, sizeof(color));
  color[1] = 1;
  sum[1] += a[1];
  Draw(1);
  if ((sum[0] % 2 + sum[1] % 2) % 2) {
    puts("NO");
    return 0;
  }
  if (sum[1] == sum[0]) {
    printf("YES\n");
    Print(!root ? 1 : root, 0, 0);
    for (int i = 1; i <= m; i++) printf("%lld\n", ans[i]);
    return 0;
  } else {
    if (!root) return puts("NO") * 0;
    printf("YES\n");
    Print(root, 0, 0);
    long long res = ans[0];
    ans[to.second] = res / 2;
    a[root] -= res / 2;
    a[to.first] -= res / 2;
    Print(root, 0, 0);
    for (int i = 1; i <= m; i++) printf("%lld\n", ans[i]);
  }
  return 0;
}
