#include <bits/stdc++.h>
using namespace std;
const int N = 305;
bool fail;
vector<int> v[N], vec[N];
int lim, n, m, a[N], b[N];
struct node {
  int x, y, d;
  void print() { printf("%d %d %d\n", x + 1, y + 1, d); }
};
vector<node> ans;
bool vis[N], del[N];
int q[N], l, r, pre[N];
void add(int x, int y, int d) {
  a[x] -= d;
  a[y] += d;
  ans.push_back((node){x, y, d});
}
void solve(int x, int pa, bool push) {
  int y, tmp;
  for (int i = 0; i < vec[x].size(); i++) {
    y = vec[x][i];
    if (y == pa || del[y]) continue;
    solve(y, x, push);
    if (push) {
      tmp = min(a[x], lim - a[y]);
      add(x, y, tmp);
    } else {
      tmp = min(lim - a[x], a[y]);
      add(y, x, tmp);
    }
  }
}
void bfs(int s) {
  int y, x;
  l = r = 0;
  q[r++] = s;
  vis[s] = 1;
  while (l < r) {
    x = q[l++];
    for (int i = 0; i < v[x].size(); i++) {
      y = v[x][i];
      if (vis[y]) continue;
      vec[x].push_back(y);
      vec[y].push_back(x);
      q[r++] = y;
      vis[y] = 1;
      pre[y] = x;
    }
  }
}
int main() {
  int x, y;
  scanf("%d%d%d", &n, &lim, &m);
  for (int i = 0; i < n; i++) scanf("%d", a + i);
  for (int i = 0; i < n; i++) scanf("%d", b + i);
  while (m--) {
    scanf("%d%d", &x, &y);
    x--, y--;
    v[x].push_back(y);
    v[y].push_back(x);
  }
  for (int i = 0; i < n; i++)
    if (!vis[i]) {
      bfs(i);
      for (int j = r - 1; j > 0; j--) {
        int c = q[j];
        if (a[c] > b[c]) {
          solve(pre[c], c, 1);
          int tmp = min(a[c] - b[c], lim - a[pre[c]]);
          add(c, pre[c], tmp);
        } else {
          solve(pre[c], c, 0);
          int tmp = min(b[c] - a[c], a[pre[c]]);
          add(pre[c], c, tmp);
        }
        del[c] = 1;
      }
    }
  fail = 0;
  for (int i = 0; i < n; i++)
    if (a[i] != b[i]) fail = 1;
  if (fail)
    puts("NO");
  else {
    printf("%d\n", ans.size());
    for (int i = 0; i < ans.size(); i++) ans[i].print();
  }
  return 0;
}
