#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5 + 10;
struct node {
  int s, id, t;
  node() {}
  node(int s1, int i, int t1) {
    s = s1;
    id = i;
    t = t1;
  }
  friend bool operator<(const node &a1, const node &a2) { return a1.s < a2.s; }
} p[maxn], p1[maxn], p2[maxn];
int t[maxn];
bool cmp(const node &a1, const node &a2) { return a1.s < a2.s; }
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &p[i].s);
    p[i].id = i;
  }
  for (int i = 1; i <= n; i++) scanf("%d", &t[i]);
  sort(p + 1, p + 1 + n, cmp);
  sort(t + 1, t + 1 + n);
  for (int i = 1; i <= n; i++) p[i].t = t[i];
  priority_queue<node> q1, q2;
  for (int i = 1; i <= n; i++) {
    if (p[i].s == p[i].t) continue;
    if (p[i].s > p[i].t)
      q1.push(p[i]);
    else
      q2.push(p[i]);
  }
  int ok = 1, num = 0;
  node t1, t2;
  while (!q1.empty() && !q2.empty()) {
    t1 = q1.top();
    t2 = q2.top();
    q1.pop();
    q2.pop();
    if (t1.s - t2.s <= 1) {
      ok = 0;
      break;
    }
    int d1 = t1.s - t1.t;
    int d2 = t2.t - t2.s;
    d1 = min(d1, d2);
    t1.s -= d1;
    t2.s += d1;
    if (t1.s != t1.t) q1.push(t1);
    if (t2.s != t2.t) q2.push(t2);
    p1[num].s = t2.id;
    p1[num].t = t1.id;
    p1[num].id = d1;
    num++;
  }
  if (q1.empty() == 0 || q2.empty() == 0) ok = 0;
  if (ok == 0)
    printf("NO\n");
  else {
    printf("YES\n");
    printf("%d\n", num);
    for (int i = 0; i < num; i++)
      printf("%d %d %d\n", p1[i].s, p1[i].t, p1[i].id);
  }
  return 0;
}
