#include <bits/stdc++.h>
using namespace std;
const int INF = (int)1e9;
const double PI = 2 * acos(0.0);
struct trans {
  int x, y, d;
};
vector<vector<int> > G;
vector<trans> ans;
int a[333], b[333], p[333], sz[333];
int find(int u) {
  if (p[u] != u) p[u] = find(p[u]);
  return p[u];
}
void join(int u, int v) {
  int i = find(u), j = find(v);
  if (i == j) return;
  if (sz[i] < sz[j])
    p[i] = j;
  else if (sz[i] > sz[j])
    p[j] = i;
  else {
    p[j] = i;
    ++sz[i];
  }
}
int get(int p, int u, int d) {
  int res = min(max(a[u] - b[u], 0), d);
  a[u] -= res;
  int idx = ans.size();
  for (int i = 0; i < G[u].size(); ++i) {
    int v = G[u][i];
    if (v == p) continue;
    int total = get(u, v, d - res);
    res += total;
  }
  if (p) {
    int m = min(a[u], res);
    if (m > 0) ans.insert(ans.begin() + idx, {u, p, m});
    if (m < res) ans.push_back({u, p, res - m});
  }
  return res;
}
void solve(int u) { a[u] += get(0, u, b[u] - a[u]); }
int main() {
  int n, v, e, x, y;
  while (cin >> n >> v >> e) {
    for (int i = 0; i <= n; ++i) {
      p[i] = i;
      sz[i] = 1;
    }
    G.assign(n + 1, vector<int>());
    ans.clear();
    for (int i = 1; i <= n; ++i) cin >> a[i];
    for (int i = 1; i <= n; ++i) cin >> b[i];
    for (int i = 0; i < e; ++i) {
      cin >> x >> y;
      if (find(x) != find(y)) {
        G[x].push_back(y);
        G[y].push_back(x);
        join(x, y);
      }
    }
    for (int i = 1; i <= n; ++i) {
      if (a[i] < b[i]) solve(i);
    }
    bool solved = true;
    for (int i = 1; i <= n; ++i)
      if (a[i] != b[i]) solved = false;
    if (!solved) {
      cout << "NO" << endl;
      continue;
    }
    cout << ans.size() << endl;
    for (int i = 0; i < (int)ans.size(); ++i)
      cout << ans[i].x << " " << ans[i].y << " " << ans[i].d << endl;
  }
  return 0;
}
