#include <bits/stdc++.h>
using namespace std;
int n, v, e1;
int a[310], b[310];
int x[201010], y[201010], z1[201010];
int cntans = 0;
class Road {
 public:
  int t, next;
} e[110101];
int p[310];
int z = -1;
int fa[333];
int flag[333];
bool del[333];
int link[333];
void add(int u, int v) {
  ++z;
  e[z].t = v;
  e[z].next = p[u];
  p[u] = z;
}
void push(int a78, int b, int c) {
  a[a78] -= c;
  a[b] += c;
  x[++cntans] = a78;
  y[cntans] = b;
  z1[cntans] = c;
}
void f(int x, int y, int d) {
  int key = min(d, a[fa[y]]);
  if (key > 0) push(fa[y], y, key);
  if (fa[y] != x) f(x, fa[y], d);
  if (key < d) push(fa[y], y, d - key);
}
void dfs(int u, int top, int tag) {
  flag[u] = tag;
  int delt = min(a[top] - b[top], b[u] - a[u]);
  if (delt > 0) {
    f(top, u, delt);
  }
  for (int tmp = p[u]; tmp != -1; tmp = e[tmp].next)
    if (flag[e[tmp].t] != tag) {
      fa[e[tmp].t] = u;
      dfs(e[tmp].t, top, tag);
    }
}
int main() {
  memset(p, -1, sizeof(p));
  scanf("%d%d%d", &n, &v, &e1);
  for (int i = 1; i <= n; ++i) {
    scanf("%d", &a[i]);
  }
  for (int i = 1; i <= n; ++i) {
    scanf("%d", &b[i]);
  }
  int xin, yin;
  for (int i = 1; i <= e1; ++i) {
    scanf("%d%d", &xin, &yin);
    add(xin, yin);
    add(yin, xin);
  }
  for (int i = 1; i <= n; ++i) {
    for (int tmp = p[i]; tmp != -1; tmp = e[tmp].next) {
      fa[e[tmp].t] = i;
      flag[i] = i;
      dfs(e[tmp].t, i, i);
    }
  }
  for (int i = 1; i <= n; ++i)
    if (a[i] != b[i]) {
      printf("NO\n");
      return 0;
    }
  printf("%d\n", cntans);
  for (int i = 1; i <= cntans; ++i) printf("%d %d %d\n", x[i], y[i], z1[i]);
  return 0;
}
