#include <bits/stdc++.h>
using namespace std;
int N, V, M;
int Size[310], Final[310], T[310];
vector<int> G[310];
vector<pair<pair<int, int>, int> > ANS;
int source, sink, flow;
void FindSource(int node) {
  if (Size[node] > Final[node]) {
    source = node;
    return;
  }
  for (vector<int>::iterator it = G[node].begin(); it != G[node].end(); ++it)
    if (T[*it] == 0 && *it != sink) {
      T[*it] = node;
      FindSource(*it);
    }
}
void Transfer(int source, int sink, int flow) {
  Size[source] -= flow;
  Size[sink] += flow;
  ANS.push_back(make_pair(make_pair(source, sink), flow));
}
void Push(int node) {
  int next = T[node];
  if (next == sink) {
    Transfer(node, sink, flow);
    return;
  }
  int add = 0;
  if (Size[next] < flow) {
    add = flow - Size[next];
    Transfer(node, next, add);
  }
  Push(next);
  Transfer(node, next, flow - add);
}
void Fill(int node) {
  sink = node;
  while (Size[node] < Final[node]) {
    source = 0;
    memset(T, 0, sizeof(T));
    FindSource(node);
    if (source == 0) break;
    flow = min(Size[source] - Final[source], Final[sink] - Size[sink]);
    Push(source);
  }
}
int main() {
  cin >> N >> V >> M;
  for (int i = 1; i <= N; i++) cin >> Size[i];
  for (int i = 1; i <= N; i++) cin >> Final[i];
  for (int i = 1; i <= M; i++) {
    int a, b;
    cin >> a >> b;
    G[a].push_back(b);
    G[b].push_back(a);
  }
  for (int i = 1; i <= N; i++)
    if (Size[i] < Final[i]) Fill(i);
  bool OK = 1;
  for (int i = 1; i <= N; i++)
    if (Size[i] != Final[i]) OK = 0;
  if (OK == 0)
    cout << "NO" << '\n';
  else {
    cout << ANS.size() << '\n';
    for (vector<pair<pair<int, int>, int> >::iterator it = ANS.begin();
         it != ANS.end(); ++it)
      cout << (it->first).first << ' ' << (it->first).second << ' '
           << (it->second) << '\n';
  }
  return 0;
}
