#include <bits/stdc++.h>
const int mod = 1e9 + 7;
const int N = 1010;
const int inf = 0x3f3f3f3f;
using namespace std;
long long sum[N];
int n, a[N], b[N], v, e;
int p[N];
int find(int x) {
  if (p[x] != x) p[x] = find(p[x]);
  return p[x];
}
vector<int> vt[N];
bool vis[N];
struct Data {
  int a, b, c;
};
Data que[N * N];
int head;
bool dfs(int from, int to, int cap) {
  if (from == to) return 1;
  vis[from] = 1;
  for (int i = 0; i < vt[from].size(); i++) {
    int t = vt[from][i];
    if (vis[t]) continue;
    if (a[t] < cap) {
      int tmp = cap - a[t];
      a[from] -= cap - a[t];
      a[t] += tmp;
      que[head++] = (Data{from, t, tmp});
      if (dfs(t, to, cap) == 0) {
        a[from] += tmp;
        a[t] -= tmp;
        head--;
        continue;
      }
      a[from] -= cap - tmp;
      a[t] += cap - tmp;
      que[head++] = (Data{from, t, cap - tmp});
    } else {
      if (dfs(t, to, cap) == 0) continue;
      a[from] -= cap;
      a[t] += cap;
      que[head++] = (Data{from, t, cap});
    }
    return 1;
  }
  return 0;
}
int main() {
  queue<int> quea[N], queb[N];
  scanf("%d%d%d", &n, &v, &e);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
    p[i] = i;
  }
  for (int i = 1; i <= n; i++) scanf("%d", &b[i]);
  for (int i = 1; i <= e; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    vt[x].push_back(y);
    vt[y].push_back(x);
    p[find(x)] = find(y);
  }
  for (int i = 1; i <= n; i++) {
    int x = find(i);
    sum[x] += a[i] - b[i];
    if (a[i] > b[i]) quea[x].push(i);
    if (b[i] > a[i]) queb[x].push(i);
  }
  for (int i = 1; i <= n; i++)
    if (sum[i]) return puts("NO"), 0;
  for (int i = 1; i <= n; i++) {
    if (find(i) != i) continue;
    while (quea[i].size()) {
      memset(vis, 0, sizeof(vis));
      int x = quea[i].front();
      int y = queb[i].front();
      if (a[x] - b[x] > b[y] - a[y]) {
        dfs(x, y, b[y] - a[y]);
        queb[i].pop();
      } else if (a[x] - b[x] < b[y] - a[y]) {
        dfs(x, y, a[x] - b[x]);
        quea[i].pop();
      } else {
        dfs(x, y, a[x] - b[x]);
        quea[i].pop();
        queb[i].pop();
      }
    }
  }
  cout << head << endl;
  for (int i = 0; i < head; i++) {
    Data da = que[i];
    cout << da.a << " " << da.b << " " << da.c << endl;
  }
  return 0;
}
