#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
typedef pair<int,int> pii;
const int mx = 505;
#define INF 1000000000
int N, W, M=0;
int A[mx][mx], B[mx][mx];
vector<vector<pii>> gA(mx), gB(mx);
vector<pair<pii,int>> ans;
int fmx[mx][mx];
int fmn[mx][mx];
vector<pair<int ,pii>> pqA, pqB;
vector<int> p;
int find(int x) {
if(p[x]<0) return x;
return p[x] = find(p[x]);
}
bool uni(int a, int b) {
a = find(a);
b = find(b);
if(a == b) return false;
if(p[a] > p[b]) swap(a, b);
p[a] += p[b];
p[b] = a;
return true;
}
void MST(vector<pair<int,pii>>& pq) {
p.assign(mx, -1);
int cnt = 0;
for(auto [w, p]: pq) {
auto [x, y] = p;
if(uni(x, y)) {
cnt++;
ans.push_back({p, w});
}
if(cnt >= N-1) return;
}
}
int main() {
cin>>N>>W;
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
if(i == j) {
fmn[i][j] = 0;
fmx[i][j] = INF;
}
else {
fmn[i][j] = INF;
fmx[i][j] = 0;
}
}
}
for(int j=1; j<N; j++)
for(int i=0; i<j; i++) {
int k;
cin>>k;
A[i][j] = W-k;
}
for(int j=1; j<N; j++)
for(int i=0; i<j; i++) {
cin>>B[i][j];
if(B[i][j] >= A[i][j]) {
// fmx[i][j] = fmx[j][i] = max(A[i][j], B[i][j]);
// fmn[i][j] = fmn[j][i] = min(A[i][j], B[i][j]);
// ans.push_back({{i, j}, A[i][j]});
// ans.push_back({{i, j}, B[i][j]});
// gA[i].push_back({j, A[i][j]});
// gA[j].push_back({i, A[i][j]});
// gB[i].push_back({j, B[i][j]});
// gB[j].push_back({i, B[i][j]});
pqA.push_back({A[i][j], {i, j}});
pqB.push_back({B[i][j], {i, j}});
}
}
sort(pqA.begin(), pqA.end());
MST(pqA);
sort(pqB.rbegin(), pqB.rend());
MST(pqB);
// check
for(auto [p, w]:ans) {
auto [i, j] = p;
fmx[i][j] = fmx[j][i] = max(fmx[i][j], w);
fmn[i][j] = fmn[j][i] = min(fmn[i][j], w);
}
for(int k=0; k<N; k++) {
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
fmx[i][j] = max(fmx[i][j], min(fmx[i][k], fmx[k][j]));
fmn[i][j] = min(fmn[i][j], max(fmn[i][k], fmn[k][j]));
}
}
}
for(int j=1; j<N; j++) {
for(int i=0; i<j; i++) {
if(fmx[i][j] != B[i][j]) {cout<<"NO"; return 0;}
if(fmn[i][j] != A[i][j]) {cout<<"NO"; return 0;}
}
}
cout<<ans.size()<<'\n';
for(auto [p, w]:ans) {
cout<<p.first<<' '<<p.second<<' '<<w<<'\n';
}
}