#include <bits/stdc++.h>
using namespace std;
const int maxn = 333;
bool vis[maxn];
int a[maxn][maxn], p[maxn];
long long s[maxn], t[maxn], q[maxn];
int n, m, i, j, k, idx, x, y;
long long V, dmax, d, dt;
vector<pair<pair<int, int>, long long> > mc, mf;
void dfs(int x) {
  int y;
  vis[x] = true;
  q[x] = s[x];
  for (y = 1; y <= n; y++)
    if (a[x][y] && !vis[y]) {
      p[y] = x;
      dfs(y);
      if (q[y] > t[y]) {
        mc.push_back(make_pair(make_pair(y, x), q[y] - t[y]));
        q[x] += q[y] - t[y];
      } else if (q[y] < t[y]) {
        mc.push_back(make_pair(make_pair(x, y), t[y] - q[y]));
        q[x] -= t[y] - q[y];
      }
    }
}
int main() {
  scanf("%d%I64d%d", &n, &V, &m);
  for (i = 1; i <= n; i++) scanf("%I64d", &s[i]);
  for (i = 1; i <= n; i++) scanf("%I64d", &t[i]);
  while (m--) {
    scanf("%d%d", &x, &y);
    a[x][y] = a[y][x] = 1;
  }
  for (i = 1; i <= n; i++)
    if (!vis[i]) {
      mc.clear();
      dfs(i);
      if (q[i] != t[i]) {
        puts("NO");
        return 0;
      }
      while (1) {
        idx = -1;
        dmax = 0;
        for (i = 0; i < mc.size(); i++) {
          d = mc[i].second;
          x = mc[i].first.first;
          y = mc[i].first.second;
          if (s[x] < d) d = s[x];
          if (V - s[y] < d) d = V - s[y];
          if (d > dmax) {
            dmax = d;
            idx = i;
          }
        }
        if (dmax == 0) break;
        x = mc[idx].first.first;
        y = mc[idx].first.second;
        s[x] -= dmax;
        s[y] += dmax;
        mc[idx].second -= dmax;
        mf.push_back(make_pair(make_pair(x, y), dmax));
      }
    }
  printf("%d\n", mf.size());
  for (int i = 0; i < mf.size(); i++)
    printf("%d %d %I64d\n", mf[i].first.first, mf[i].first.second,
           mf[i].second);
  return 0;
}
