#include <bits/stdc++.h>   using namespace std;   int N, V, M;   int Size[310], Final[310], T[310];   vector<int> G[310];   vector<pair<pair<int, int>, int> > ANS;   int source, sink, flow;   void FindSource(int node) {     if (Size[node] > Final[node]) {       source = node;       return;     }     for (vector<int>::iterator it = G[node].begin(); it != G[node].end(); ++it)       if (T[*it] == 0 && *it != sink) {         T[*it] = node;         FindSource(*it);       }   }   void Transfer(int source, int sink, int flow) {     Size[source] -= flow;     Size[sink] += flow;     ANS.push_back(make_pair(make_pair(source, sink), flow));   }   void Push(int node) {     int next = T[node];     if (next == sink) {       Transfer(node, sink, flow);       return;     }     int add = 0;     if (Size[next] < flow) {       add = flow - Size[next];       Transfer(node, next, add);     }     Push(next);     Transfer(node, next, flow - add);   }   void Fill(int node) {     sink = node;     while (Size[node] < Final[node]) {       source = 0;       memset(T, 0, sizeof(T));       FindSource(node);       if (source == 0) break;       flow = min(Size[source] - Final[source], Final[sink] - Size[sink]);       Push(source);     }   }   int main() {     cin >> N >> V >> M;     for (int i = 1; i <= N; i++) cin >> Size[i];     for (int i = 1; i <= N; i++) cin >> Final[i];     for (int i = 1; i <= M; i++) {       int a, b;       cin >> a >> b;       G[a].push_back(b);       G[b].push_back(a);     }     for (int i = 1; i <= N; i++)       if (Size[i] < Final[i]) Fill(i);     bool OK = 1;     for (int i = 1; i <= N; i++)       if (Size[i] != Final[i]) OK = 0;     if (OK == 0)       cout <<  NO  <<   n ;     else {       cout << ANS.size() <<   n ;       for (vector<pair<pair<int, int>, int> >::iterator it = ANS.begin();            it != ANS.end(); ++it)         cout << (it->first).first <<     << (it->first).second <<                  << (it->second) <<   n ;     }     return 0;   }   