#include <bits/stdc++.h>
using namespace std;
int n, vol, e;
int a[300], b[300];
bool conn[300][300];
vector<int> edge[300];
bool done[300];
vector<pair<pair<int, int>, int> > res;
int pre[300];
void go(int v, int p, vector<int> &vs) {
  if (done[v]) return;
  done[v] = true;
  vs.push_back(v);
  for (int i = 0; i < (int)(edge[v].size()); i++) go(edge[v][i], v, vs);
}
void makePath(int v, int par) {
  if (pre[v] != -1) return;
  pre[v] = par;
  for (int i = 0; i < (int)(edge[v].size()); i++) makePath(edge[v][i], v);
}
void pour(int x, int y, int d) {
  if (x == y) return;
  int z = pre[y];
  if (a[z] >= d) {
    res.push_back(make_pair(make_pair(z + 1, y + 1), d));
    a[y] += d;
    a[z] -= d;
    pour(x, z, d);
  } else {
    res.push_back(make_pair(make_pair(z + 1, y + 1), a[z]));
    int tmp = d - a[z];
    a[y] += a[z];
    a[z] = 0;
    pour(x, z, d);
    res.push_back(make_pair(make_pair(z + 1, y + 1), tmp));
    a[y] += tmp;
    a[z] -= tmp;
  }
}
bool check(const vector<int> &vs) {
  long long sum = 0;
  for (int i = 0; i < (int)(vs.size()); i++) sum += a[vs[i]] - b[vs[i]];
  return sum == 0;
}
bool solve() {
  for (int k = 0; k < (int)(n); k++) {
    if (done[k]) continue;
    vector<int> vs;
    go(k, -1, vs);
    if (!check(vs)) return false;
    for (int i = 0; i < (int)(vs.size()); i++) {
      memset(pre, -1, sizeof(pre));
      makePath(vs[i], vs[i]);
      for (int j = 0; j < (int)(vs.size()); j++) {
        if (i == j) continue;
        int x = vs[i], y = vs[j];
        if (a[x] > b[x] && a[y] < b[y]) {
          pour(x, y, min(a[x] - b[x], b[y] - a[y]));
        }
      }
    }
  }
  return true;
}
int main() {
  cin >> n >> vol >> e;
  for (int i = 0; i < (int)(n); i++) cin >> a[i];
  for (int i = 0; i < (int)(n); i++) cin >> b[i];
  for (int i = 0; i < (int)(e); i++) {
    int x, y;
    cin >> x >> y;
    if (!conn[--x][--y]) {
      conn[y][x] = conn[x][y] = true;
      edge[x].push_back(y);
      edge[y].push_back(x);
    }
  }
  if (solve()) {
    cout << res.size() << endl;
    for (int i = 0; i < (int)(res.size()); i++)
      cout << res[i].first.first << " " << res[i].first.second << " "
           << res[i].second << endl;
  } else {
    puts("NO");
  }
  return 0;
}
