#include <bits/stdc++.h>
using namespace std;
const int MAXV = 303;
const int MAXE = 100100;
int n, m, mxv, parent[MAXV], arr[MAXV], need[MAXV], deg[MAXV], vis[MAXV], visID,
    head[MAXV], nxt[MAXE], to[MAXE], Ecnt, ansSz;
bool done[MAXV];
char ans[MAXV * MAXV * 2][30];
void addEdge(int u, int v) {
  nxt[Ecnt] = head[u];
  head[u] = Ecnt;
  to[Ecnt++] = v;
  ++deg[v];
}
int sk[MAXV], sz;
void dfs0(int cur) {
  vis[cur] = visID;
  for (int i = head[cur]; ~i; i = nxt[i])
    if (!done[to[i]] && vis[to[i]] != visID) {
      dfs0(to[i]);
      int d = min(mxv - arr[to[i]], arr[cur]);
      arr[cur] -= d, arr[to[i]] += d;
      sprintf(ans[ansSz++], "%d %d %d", cur, to[i], d);
    }
}
void dfs1(int cur, bool flag = 0) {
  vis[cur] = visID;
  for (int i = head[cur]; ~i; i = nxt[i])
    if (!done[to[i]] && vis[to[i]] != visID) {
      dfs1(to[i]);
      int d = min((flag ? need[cur] : mxv) - arr[cur], arr[to[i]]);
      arr[cur] += d, arr[to[i]] -= d;
      sprintf(ans[ansSz++], "%d %d %d", to[i], cur, d);
    }
}
int find(int cur) {
  return parent[cur] = (cur == parent[cur] ? cur : find(parent[cur]));
}
void connect(int u, int v) { parent[parent[u]] = parent[v]; }
int main() {
  memset(head, -1, sizeof head);
  scanf("%d%d%d", &n, &mxv, &m);
  for (int i = 1; i <= n; ++i) scanf("%d", arr + i), parent[i] = i;
  for (int i = 1; i <= n; ++i) scanf("%d", need + i);
  while (m--) {
    int u, v;
    scanf("%d%d", &u, &v);
    if (find(u) == find(v)) continue;
    connect(u, v);
    addEdge(u, v);
    addEdge(v, u);
  }
  for (int i = 1; i <= n; ++i)
    if (deg[i] < 2) sk[sz++] = i, deg[i] = MAXE;
  while (sz) {
    int cur = sk[--sz];
    ++visID;
    dfs0(cur);
    if (arr[cur] > need[cur]) return puts("NO"), 0;
    need[cur] -= arr[cur];
    arr[cur] = 0;
    ++visID;
    dfs1(cur, 1);
    if (arr[cur] != need[cur]) return puts("NO"), 0;
    arr[cur] = need[cur] = 0, done[cur] = 1;
    for (int i = head[cur]; ~i; i = nxt[i])
      if (!done[to[i]] && --deg[to[i]] < 2) sk[sz++] = to[i], deg[to[i]] = MAXE;
  }
  printf("%d\n", ansSz);
  for (int i = 0; i < ansSz; ++i) puts(ans[i]);
  return 0;
}
