#include <bits/stdc++.h>
using namespace std;
const int maxn = 308;
int n, V, m, a[maxn], b[maxn], tot, deg[maxn];
queue<int> Q;
bool vis[maxn];
long long acnt, bcnt;
struct Edge {
  Edge *n, *r;
  int v;
  bool loc;
  Edge() {}
} * h[maxn];
struct Answer {
  int u, v, d;
  Answer(int _u = 0, int _v = 0, int _d = 0) {
    u = _u;
    v = _v;
    d = _d;
  }
  inline void Output() { printf("%d %d %d\n", u, v, d); }
} ans[maxn * maxn * 2];
inline Edge *AddEdge(int u, int v) {
  Edge *x = new Edge();
  x->v = v;
  x->n = h[u];
  h[u] = x;
  x->loc = 1;
  return x;
}
inline void AddLine(int u, int v) {
  Edge *x = AddEdge(u, v);
  Edge *y = AddEdge(v, u);
  x->r = y;
  y->r = x;
}
void Calc(int u) {
  vis[u] = true;
  acnt += a[u];
  bcnt += b[u];
  for (Edge *i = h[u]; i; i = i->n)
    if (!vis[i->v]) {
      Calc(i->v);
      deg[i->v]++, deg[u]++;
      i->loc = i->r->loc = 0;
    }
}
void Release(int u, int d, int fa) {
  for (Edge *i = h[u]; i; i = i->n) {
    int v = i->v;
    if (v == fa || i->loc || vis[v]) continue;
    Release(v, max(0, d - (V - a[v])), u);
    int tmp = min(d, V - a[v]);
    if (!tmp) continue;
    ans[tot++] = Answer(u, v, tmp);
    a[v] += tmp;
    a[u] -= tmp;
    d -= tmp;
  }
}
void Request(int u, int d, int fa) {
  for (Edge *i = h[u]; i; i = i->n) {
    int v = i->v;
    if (v == fa || i->loc || vis[v]) continue;
    Request(v, min(max(0, d - a[v]), V - a[v]), u);
    int tmp = min(d, a[v]);
    if (!tmp) continue;
    ans[tot++] = Answer(v, u, tmp);
    a[v] -= tmp;
    a[u] += tmp;
    d -= tmp;
  }
}
int main() {
  scanf("%d%d%d", &n, &V, &m);
  for (int i = 1; i <= n; i++) scanf("%d", a + i);
  for (int i = 1; i <= n; i++) scanf("%d", b + i);
  for (int i = 1; i <= m; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    AddLine(u, v);
  }
  for (int i = 1; i <= n; i++)
    if (!vis[i]) {
      Calc(i);
      if (acnt != bcnt) {
        printf("NO\n");
        return 0;
      } else
        acnt = bcnt = 0;
    }
  fill(vis + 1, vis + n + 1, 0);
  for (int i = 1; i <= n; i++)
    if (deg[i] == 1) Q.push(i);
  while (!Q.empty()) {
    int u = Q.front();
    Q.pop();
    vis[u] = true;
    if (a[u] > b[u])
      Release(u, a[u] - b[u], 0);
    else if (a[u] < b[u])
      Request(u, b[u] - a[u], 0);
    for (Edge *i = h[u]; i; i = i->n)
      if (!i->loc && --deg[i->v] == 1) Q.push(i->v);
  }
  printf("%d\n", tot);
  for (int i = 0; i < tot; i++) ans[i].Output();
  return 0;
}
