#include <bits/stdc++.h>
using namespace std;
const int SIZEN = 310;
int N, V, M;
bool c[SIZEN][SIZEN] = {0};
int A[SIZEN], B[SIZEN];
bool vis[SIZEN];
int fa[SIZEN];
int DFS(int x) {
  vis[x] = true;
  if (A[x] < B[x]) return x;
  for (int i = 1; i <= N; i++) {
    if (c[x][i] && !vis[i]) {
      fa[i] = x;
      int p = DFS(i);
      if (p) return p;
    }
  }
  return 0;
}
class Opt {
 public:
  int u, v, w;
};
vector<Opt> O;
void transfer(int a, int b, int w) {
  O.push_back((Opt){a, b, w});
  A[a] -= w;
  A[b] += w;
}
void pour(int s, int t, int d) {
  if (s == t) return;
  int y = fa[t], w = A[y];
  transfer(y, t, min(A[y], d));
  pour(s, y, d);
  if (A[y] > w) transfer(y, t, A[y] - w);
}
bool work(void) {
  int rem = 0;
  for (int i = 1; i <= N; i++)
    if (A[i] != B[i]) rem++;
  while (rem) {
    int s = 0, t = 0;
    for (int i = 1; i <= N; i++) {
      if (A[i] > B[i]) {
        s = i;
        break;
      }
    }
    if (!s) return false;
    memset(vis, 0, sizeof(vis));
    t = DFS(s);
    if (!t) return false;
    int d = min(A[s] - B[s], B[t] - A[t]);
    pour(s, t, d);
    if (A[s] == B[s]) rem--;
    if (A[t] == B[t]) rem--;
  }
  return true;
}
void read(void) {
  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]);
  int u, v;
  for (int i = 1; i <= M; i++) {
    scanf("%d%d", &u, &v);
    c[u][v] = c[v][u] = true;
  }
}
int main() {
  read();
  if (!work())
    printf("NO\n");
  else {
    printf("%d\n", O.size());
    for (int i = 0; i < O.size(); i++)
      printf("%d %d %d\n", O[i].u, O[i].v, O[i].w);
  }
  return 0;
}
