#include <bits/stdc++.h>
using namespace std;
const double EPS = 1e-9;
const int MAXN = 310;
int n, maxV, e;
vector<int> G[MAXN];
set<int> g[MAXN];
int a[MAXN];
int b[MAXN];
bool was[MAXN];
int to_push[MAXN];
bool ready[MAXN];
vector<int> top;
vector<pair<pair<int, int>, int> > ans;
void dfs(int v) {
  was[v] = true;
  for (int i = 0; i < int(((int)(G[v]).size())); i++) {
    int to = G[v][i];
    if (!was[to]) {
      g[v].insert(to);
      g[to].insert(v);
      dfs(to);
    }
  }
}
void prepare() {
  memset(was, false, sizeof was);
  for (int i = 0; i < int(n); i++)
    if (!was[i]) dfs(i);
}
void push(int v, int to) {
  int d = min(a[v], maxV - a[to]);
  if (d == 0) return;
  a[v] -= d;
  a[to] += d;
  ans.push_back(make_pair(make_pair(v, to), d));
}
void push(int v, int to, int d) {
  if (d == 0) return;
  a[v] -= d;
  a[to] += d;
  ans.push_back(make_pair(make_pair(v, to), d));
}
void topsort(int v, int p) {
  to_push[v] = p;
  was[v] = true;
  for (set<int>::iterator it = g[v].begin(); it != g[v].end(); it++) {
    int to = *it;
    if (!was[to]) topsort(to, v);
  }
  top.push_back(v);
}
void solve(int leaf) {
  ready[leaf] = true;
  int st = *g[leaf].begin();
  g[st].erase(leaf);
  memset(was, false, sizeof was);
  top.clear();
  topsort(st, -1);
  for (int i = 0; i < int(((int)(top).size()) - 1); i++) {
    int v = top[i];
    int to = to_push[v];
    if (a[leaf] < b[leaf])
      push(v, to);
    else
      push(to, v);
  }
  if (a[leaf] < b[leaf]) {
    if (a[st] < b[leaf] - a[leaf]) {
      a[leaf] = -1;
      return;
    }
    push(st, leaf, b[leaf] - a[leaf]);
  } else {
    if (a[st] + a[leaf] - b[leaf] > maxV) {
      a[leaf] = -1;
      return;
    }
    push(leaf, st, a[leaf] - b[leaf]);
  }
}
int main() {
  scanf("%d %d %d", &n, &maxV, &e);
  for (int i = 0; i < int(n); i++) scanf("%d", &a[i]);
  for (int i = 0; i < int(n); i++) scanf("%d", &b[i]);
  for (int i = 0; i < int(e); i++) {
    int a, b;
    scanf("%d %d", &a, &b);
    a--;
    b--;
    G[a].push_back(b);
    G[b].push_back(a);
  }
  prepare();
  memset(ready, false, sizeof ready);
  while (true) {
    bool wasr = false;
    for (int i = 0; i < int(n); i++)
      if (!ready[i] && ((int)(g[i]).size()) == 1) {
        solve(i);
        wasr = true;
      }
    if (!wasr) break;
  }
  for (int i = 0; i < int(n); i++)
    if (a[i] != b[i]) {
      puts("NO");
      return 0;
    }
  printf("%d\n", ((int)(ans).size()));
  for (int i = 0; i < int(((int)(ans).size())); i++)
    printf("%d %d %d\n", ans[i].first.first + 1, ans[i].first.second + 1,
           ans[i].second);
  return 0;
}
