#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:16777216")
using namespace std;
vector<long long> path, g[400];
vector<pair<pair<long long, long long>, long long> > ans;
long long a[400], b[400], x, y, col, st, fn, n, v, e, used[400], SA, SB;
bool vis[400];
void flow(int idx, int d) {
  if (idx == path.size()) return;
  if (a[path[idx]] >= d) {
    a[path[idx - 1]] += d;
    a[path[idx]] -= d;
    ans.push_back(make_pair(make_pair(path[idx], path[idx - 1]), d));
    flow(idx + 1, d);
  } else {
    long long tmp = d - a[path[idx]];
    a[path[idx - 1]] += a[path[idx]];
    ans.push_back(make_pair(make_pair(path[idx], path[idx - 1]), a[path[idx]]));
    a[path[idx]] = 0;
    flow(idx + 1, d);
    a[path[idx - 1]] += tmp;
    a[path[idx]] -= tmp;
    ans.push_back(make_pair(make_pair(path[idx], path[idx - 1]), tmp));
  }
}
bool find_path(int V) {
  if (V == y) {
    path.push_back(V);
    return true;
  }
  vis[V] = true;
  for (int i = 0; i < g[V].size(); i++) {
    int to = g[V][i];
    if (!vis[to])
      if (find_path(to)) {
        path.push_back(V);
        return true;
      }
  }
  return false;
}
bool findP() {
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++)
      if (a[i] > b[i] && a[j] < b[j] && used[i] == used[j]) {
        x = i, y = j;
        return true;
      }
  return false;
}
void dfs(int V) {
  used[V] = col;
  SA += a[V];
  SB += b[V];
  for (int i = 0; i < g[V].size(); i++) {
    int to = g[V][i];
    if (!used[to]) dfs(to);
  }
}
int main() {
  scanf("%I64d%I64d%I64d", &n, &v, &e);
  for (int i = 1; i <= n; i++) scanf("%I64d", a + i);
  for (int i = 1; i <= n; i++) scanf("%I64d", b + i);
  for (int i = 1; i <= e; i++) {
    scanf("%I64d%I64d", &x, &y);
    g[x].push_back(y);
    g[y].push_back(x);
  }
  for (int i = 1; i <= n; i++)
    if (!used[i]) {
      SA = 0;
      SB = 0;
      col++;
      dfs(i);
      if (SA != SB) {
        puts("NO");
        return 0;
      }
    }
  while (findP()) {
    path.clear();
    for (int i = 1; i <= n; i++) vis[i] = false;
    find_path(x);
    if (a[x] - b[x] + a[y] <= v)
      flow(1, a[x] - b[x]);
    else if (b[y] - a[y] <= a[x])
      flow(1, b[y] - a[y]);
  }
  printf("%I64d\n", ans.size());
  for (int i = 0; i < ans.size(); i++)
    printf("%I64d %I64d %I64d\n", ans[i].first.first, ans[i].first.second,
           ans[i].second);
}
