#include <bits/stdc++.h>
using namespace std;
const int NMAX = 310;
int N, V, E;
int A[NMAX], B[NMAX];
int64_t sumA, sumB;
bool visited[NMAX], Fixed[NMAX];
vector<int> G[NMAX], Comps[NMAX];
vector<pair<pair<int, int>, int>> result;
void DFS(int node, int comp) {
  visited[node] = true;
  sumA += A[node];
  sumB += B[node];
  for (int i = 0; i < int(G[node].size()); ++i) {
    int _node = G[node][i];
    if (visited[_node]) continue;
    DFS(_node, comp);
  }
  Comps[comp].push_back(node);
}
void Go(int node, int value) {
  visited[node] = true;
  for (int i = 0; i < int(G[node].size()) && value; ++i) {
    int son = G[node][i];
    if (Fixed[son] || visited[son]) continue;
    Go(son, value);
    if (value > 0) {
      int sub = min(A[node], min(V - A[son], value));
      value -= sub;
      A[node] -= sub;
      A[son] += sub;
      result.push_back({{node, son}, sub});
    } else {
      int add = min(V - A[node], min(A[son], -value));
      value += add;
      A[node] += add;
      A[son] -= add;
      result.push_back({{son, node}, add});
    }
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  int i, j, x, y;
  cin >> N >> V >> E;
  for (i = 1; i <= N; ++i) cin >> A[i];
  for (i = 1; i <= N; ++i) cin >> B[i];
  while (E--) {
    cin >> x >> y;
    G[x].push_back(y);
    G[y].push_back(x);
  }
  int comp = 0;
  for (i = 1; i <= N; ++i) {
    if (visited[i]) continue;
    sumA = sumB = 0;
    DFS(i, comp++);
    if (sumA != sumB) {
      cout << "NO\n";
      return 0;
    }
  }
  for (i = 0; i < comp; ++i) {
    for (j = 0; j < int(Comps[i].size()); ++j) {
      int node = Comps[i][j];
      memset(visited, 0, sizeof(visited));
      Fixed[node] = true;
      Go(node, A[node] - B[node]);
    }
  }
  cout << result.size() << '\n';
  for (i = 0; i < int(result.size()); ++i)
    cout << result[i].first.first << ' ' << result[i].first.second << ' '
         << result[i].second << '\n';
  return 0;
}
