#include <bits/stdc++.h>
using namespace std;
const int MAX = 301;
struct entry {
  int u, v, w;
  entry(int u = 0, int v = 0, int w = 0) : u(u), v(v), w(w) {}
};
int N, V;
int a[MAX], b[MAX];
bool adj[MAX][MAX];
int ant[MAX][MAX];
bool path[MAX][MAX];
vector<entry> ans;
inline void push(int u, int v, int w) {
  if (w) {
    ans.push_back(entry(u + 1, v + 1, w));
    a[u] -= w, a[v] += w;
  }
}
void flow(int u, int v, int d) {
  if (u == v) return;
  int t = ant[u][v];
  int w = min(a[t], d);
  push(t, v, w);
  flow(u, t, d);
  push(t, v, d - w);
}
void solve(int u, int v) {
  if (a[u] < b[u]) swap(u, v);
  int trans = min(a[u] - b[u], b[v] - a[v]);
  flow(u, v, trans);
}
void bfs(int u) {
  queue<int> Q;
  Q.push(u);
  while (!Q.empty()) {
    int s = Q.front();
    Q.pop();
    for (int i = 0; i < N; ++i)
      if (adj[s][i] && !path[u][i]) {
        ant[u][i] = s;
        path[u][i] = true;
        Q.push(i);
      }
  }
}
int main() {
  int M, i, j, u, v;
  scanf("%d%d%d", &N, &V, &M);
  for (i = 0; i < N; ++i) scanf("%d", a + i);
  for (i = 0; i < N; ++i) scanf("%d", b + i);
  for (i = 0; i < M; ++i) {
    scanf("%d%d", &u, &v), --u, --v;
    adj[u][v] = adj[v][u] = true;
  }
  for (i = 0; i < N; ++i) bfs(i);
  for (i = 0; i < N; ++i) {
    if (a[i] == b[i]) continue;
    int pre = a[i] < b[i];
    for (j = 0; j < N && a[i] != b[i]; ++j)
      if (j != i && a[j] != b[j] && path[i][j]) {
        int pos = a[j] < b[j];
        if (pos ^ pre) {
          solve(i, j);
        }
      }
  }
  for (i = 0; i < N; ++i)
    if (a[i] != b[i]) {
      puts("NO");
      return 0;
    }
  cout << ans.size() << endl;
  for (i = 0; i < (int)ans.size(); ++i)
    cout << ans[i].u << " " << ans[i].v << " " << ans[i].w << endl;
  return 0;
}
