#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9 + 7;
struct node {
  int u, v;
  long long w;
  node(int _u, int _v, long long _w) {
    u = _u;
    v = _v;
    w = _w;
  }
};
vector<node> ans;
int n, m;
long long C, a[309], b[309], sum;
bool G[309][309], vis[309], ed[309], V[309];
vector<int> nd;
void dfs(int u) {
  V[u] = 1;
  sum += a[u] - b[u];
  for (int i = 1; i <= n; i++) {
    if (G[u][i] && !V[i]) dfs(i);
  }
  nd.push_back(u);
}
void pull(int u, long long flow) {
  vis[u] = 1;
  for (int v = 1; v <= n; v++) {
    if (G[u][v] && !vis[v] && !ed[v] && flow) {
      if (a[v] >= flow) {
        a[v] -= flow;
        a[u] += flow;
        ans.push_back(node(v, u, flow));
        flow = 0;
      } else {
        pull(v, flow - a[v]);
        long long cur = min(flow, a[v]);
        a[v] -= cur;
        a[u] += cur;
        flow -= cur;
        ans.push_back(node(v, u, cur));
      }
    }
  }
}
void push(int u, long long flow) {
  vis[u] = 1;
  for (int v = 1; v <= n; v++) {
    if (G[u][v] && !vis[v] && flow && !ed[v]) {
      if (flow + a[v] <= C) {
        a[v] += flow;
        a[u] -= flow;
        ans.push_back(node(u, v, flow));
        flow = 0;
      } else {
        push(v, flow + a[v] - C);
        long long cur = min(flow, C - a[v]);
        a[v] += cur;
        a[u] -= cur;
        flow -= cur;
        ans.push_back(node(u, v, cur));
      }
    }
  }
}
int main() {
  scanf("%d%I64d%d", &n, &C, &m);
  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 <= m; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    G[u][v] = G[v][u] = 1;
  }
  for (int i = 1; i <= n; i++) {
    if (!V[i]) {
      nd.clear();
      sum = 0;
      dfs(i);
      if (sum != 0) {
        printf("NO\n");
        return 0;
      }
      for (int j = 0; j < (int)nd.size(); j++) {
        memset(vis, 0, sizeof(vis));
        int v = nd[j];
        if (a[v] > b[v])
          push(v, a[v] - b[v]);
        else if (a[v] < b[v])
          pull(v, b[v] - a[v]);
        ed[v] = 1;
      }
    }
  }
  printf("%d\n", (int)ans.size());
  for (int i = 0; i < (int)ans.size(); i++)
    printf("%d %d %I64d\n", ans[i].u, ans[i].v, ans[i].w);
  return 0;
}
