#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
long long n, m, c[MAXN], d[MAXN];
pair<long long, long long> edges[MAXN];
vector<long long> g[MAXN], t[MAXN];
bool vis[MAXN];
map<pair<long long, long long>, long long> ma;
map<pair<long long, long long>, bool> tree;
void dfs(int v) {
  vis[v] = 1;
  for (int u : g[v]) {
    if (vis[u]) continue;
    d[u] = 1 - d[v];
    t[u].push_back(v);
    t[v].push_back(u);
    tree[pair<long long, long long>(u, v)] =
        tree[pair<long long, long long>(v, u)] = 1;
    dfs(u);
  }
}
void dfs2(int v, int f = -1) {
  for (int u : t[v]) {
    if (u == f) continue;
    dfs2(u, v);
  }
  if (f != -1) {
    ma[pair<long long, long long>(min(v, f), max(v, f))] = c[v];
    c[f] -= c[v];
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  for (int i = 0; i < n; ++i) cin >> c[i];
  for (int i = 0; i < m; ++i) {
    int a, b;
    cin >> a >> b;
    a--;
    b--;
    if (a > b) swap(a, b);
    g[a].push_back(b);
    g[b].push_back(a);
    edges[i] = pair<long long, long long>(a, b);
  }
  dfs(0);
  bool y = 0;
  for (int i = 0; i < m; ++i) {
    if (tree[edges[i]]) continue;
    if (d[edges[i].first] != d[edges[i].second] || y == 1) {
      ma[edges[i]] = 0;
      continue;
    }
    long long sum = 0;
    for (int j = 0; j < n; ++j) sum += (2 * d[j] - 1) * c[j];
    if (d[edges[i].first] == 0) {
      ma[edges[i]] = -sum / 2;
      c[edges[i].first] += sum / 2;
      c[edges[i].second] += sum / 2;
    } else {
      ma[edges[i]] = sum / 2;
      c[edges[i].first] -= sum / 2;
      c[edges[i].second] -= sum / 2;
    }
    y = 1;
  }
  long long sum = 0;
  for (int i = 0; i < n; ++i) {
    sum += (2 * d[i] - 1) * c[i];
  }
  if (sum != 0) {
    cout << "NO\n";
    return 0;
  }
  cout << "YES\n";
  dfs2(0);
  for (int i = 0; i < m; ++i) cout << ma[edges[i]] << "\n";
}
