#include <bits/stdc++.h>
using namespace std;
long long s[305];
int f[305], a[305], b[305];
int nex[605], d[605], las[305], p[305];
bool use[305];
int top, V;
struct Work {
  int a, b, c;
  Work() {}
  Work(int a, int b, int c) : a(a), b(b), c(c) {}
};
vector<Work> Ans;
void Add(int x, int y) {
  nex[++top] = las[x];
  p[d[las[x] = top] = y]++;
}
int getfa(int x) { return f[x] == x ? x : f[x] = getfa(f[x]); }
void Dfs(int x, int fa, int need) {
  if (!need) return;
  if (need > 0) {
    for (int i = las[x]; i; i = nex[i])
      if (d[i] != fa && p[d[i]] > 0) {
        if (a[d[i]] < need) Dfs(d[i], x, need - a[d[i]]);
        if (a[d[i]] >= need) {
          Ans.push_back(Work(d[i], x, need));
          a[x] += need;
          a[d[i]] -= need;
          return;
        } else {
          Ans.push_back(Work(d[i], x, a[d[i]]));
          a[x] += a[d[i]];
          need -= a[d[i]];
          a[d[i]] = 0;
        }
      }
  } else {
    for (int i = las[x]; i; i = nex[i])
      if (d[i] != fa && p[d[i]] > 0) {
        if (a[d[i]] - need > V) Dfs(d[i], x, min(V + need - a[d[i]], 0));
        if (a[d[i]] - need <= V) {
          Ans.push_back(Work(x, d[i], -need));
          a[x] += need;
          a[d[i]] -= need;
          return;
        } else {
          Ans.push_back(Work(x, d[i], V - a[d[i]]));
          a[x] -= V - a[d[i]];
          need += V - a[d[i]];
          a[d[i]] = V;
        }
      }
  }
}
int main() {
  int n, m;
  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]), s[f[i] = i] = b[i] - a[i];
  for (int i = 1; i <= m; i++) {
    int x, y, fx, fy;
    scanf("%d%d", &x, &y);
    fx = getfa(x);
    fy = getfa(y);
    if (fx != fy) Add(x, y), Add(y, x), s[fx] += s[fy], f[fy] = fx;
  }
  for (int i = 1; i <= n; i++)
    if (f[i] == i && s[i]) return puts("NO"), 0;
  for (bool flag = 0; !flag;)
    for (int j = flag = 1; j <= n && flag; j++)
      if (p[j] == 1) {
        Dfs(j, 0, b[j] - a[j]);
        p[j] = 0;
        for (int k = las[j]; k; k = nex[k]) --p[d[k]];
        flag = 0;
      }
  printf("%d\n", Ans.size());
  for (int i = 0; i < Ans.size(); i++)
    printf("%d %d %d\n", Ans[i].a, Ans[i].b, Ans[i].c);
}
