#include <bits/stdc++.h>
using namespace std;
bool vis[43][43][43][513][2];
int ans;
struct node {
  int x, mv, rg;
  bool flagmv, flagth, flagup;
} a, b, c;
int get(struct node d, struct node e, struct node f) {
  int st = 0;
  if (d.flagmv) st += 1;
  if (d.flagth) st += 2;
  if (d.flagup) st += 4;
  if (e.flagmv) st += 8;
  if (e.flagth) st += 16;
  if (e.flagup) st += 32;
  if (f.flagmv) st += 64;
  if (f.flagth) st += 128;
  if (f.flagup) st += 256;
  return st;
}
void dfs(int st, struct node d, struct node e, struct node f, int st2) {
  vis[d.x][e.x][f.x][get(d, e, f)][st2] = 1;
  ans = max(ans, d.x);
  ans = max(ans, e.x);
  ans = max(ans, f.x);
  if (!st || st == 5 || st == 8) {
    if (!d.flagmv) {
      for (int i = max(1, d.x - d.mv); i <= (d.x + d.mv); i++) {
        if (i != d.x && i != e.x && i != f.x) {
          struct node tmp = d;
          tmp.x = i;
          tmp.flagmv = 1;
          if (!vis[tmp.x][e.x][f.x][get(tmp, e, f)][0]) dfs(st, tmp, e, f, 0);
        }
      }
    }
  }
  if (!st || st == 2 || st == 7) {
    if (!e.flagmv) {
      for (int i = max(1, e.x - e.mv); i <= (e.x + e.mv); i++) {
        if (i != d.x && i != e.x && i != f.x) {
          struct node tmp = e;
          tmp.x = i;
          tmp.flagmv = 1;
          if (!vis[d.x][tmp.x][f.x][get(d, tmp, f)][0]) dfs(st, d, tmp, f, 0);
        }
      }
    }
  }
  if (!st || st == 1 || st == 4) {
    if (!f.flagmv) {
      for (int i = max(1, f.x - f.mv); i <= (f.x + f.mv); i++) {
        if (i != d.x && i != e.x && i != f.x) {
          struct node tmp = f;
          tmp.x = i;
          tmp.flagmv = 1;
          if (!vis[d.x][e.x][tmp.x][get(d, e, tmp)][0]) dfs(st, d, e, tmp, 0);
        }
      }
    }
  }
  if (!st || st == 1 || st == 2) {
    if (abs(d.x - e.x) == 1 && !e.flagup) {
      struct node tmp1 = d, tmp2 = e, tmp3 = f;
      tmp2.flagup = 1;
      if (!st) {
        tmp1.x = tmp2.x;
        if (!vis[tmp1.x][tmp2.x][tmp3.x][get(tmp1, tmp2, tmp3)][0])
          dfs(4, tmp1, tmp2, tmp3, 0);
      } else if (st == 2) {
        tmp1.x = tmp3.x = tmp2.x;
        if (!vis[tmp1.x][tmp2.x][tmp3.x][get(tmp1, tmp2, tmp3)][0])
          dfs(6, tmp1, tmp2, tmp3, 0);
      }
    }
    if (abs(d.x - f.x) == 1 && !f.flagup) {
      struct node tmp1 = d, tmp2 = e, tmp3 = f;
      tmp3.flagup = 1;
      if (!st) {
        tmp1.x = tmp3.x;
        if (!vis[tmp1.x][tmp2.x][tmp3.x][get(tmp1, tmp2, tmp3)][0])
          dfs(7, tmp1, tmp2, tmp3, 0);
      } else if (st == 1) {
        tmp1.x = tmp2.x = tmp3.x;
        if (!vis[tmp1.x][tmp2.x][tmp3.x][get(tmp1, tmp2, tmp3)][0])
          dfs(9, tmp1, tmp2, tmp3, 0);
      }
    }
  }
  if (!st || st == 4 || st == 5) {
    if (abs(e.x - d.x) == 1 && !d.flagup) {
      struct node tmp1 = d, tmp2 = e, tmp3 = f;
      tmp1.flagup = 1;
      if (!st) {
        tmp2.x = tmp1.x;
        if (!vis[tmp1.x][tmp2.x][tmp3.x][get(tmp1, tmp2, tmp3)][0])
          dfs(1, tmp1, tmp2, tmp3, 0);
      } else if (st == 5) {
        tmp2.x = tmp3.x = tmp1.x;
        if (!vis[tmp1.x][tmp2.x][tmp3.x][get(tmp1, tmp2, tmp3)][0])
          dfs(3, tmp1, tmp2, tmp3, 0);
      }
    }
    if (abs(e.x - f.x) == 1 && !f.flagup) {
      struct node tmp1 = d, tmp2 = e, tmp3 = f;
      tmp3.flagup = 1;
      if (!st) {
        tmp2.x = tmp3.x;
        if (!vis[tmp1.x][tmp2.x][tmp3.x][get(tmp1, tmp2, tmp3)][0])
          dfs(8, tmp1, tmp2, tmp3, 0);
      } else if (st == 4) {
        tmp1.x = tmp2.x = tmp3.x;
        if (!vis[tmp1.x][tmp2.x][tmp3.x][get(tmp1, tmp2, tmp3)][0])
          dfs(9, tmp1, tmp2, tmp3, 0);
      }
    }
  }
  if (!st || st == 7 || st == 8) {
    if (abs(f.x - d.x) == 1 && !d.flagup) {
      struct node tmp1 = d, tmp2 = e, tmp3 = f;
      tmp1.flagup = 1;
      if (!st) {
        tmp3.x = tmp1.x;
        if (!vis[tmp1.x][tmp2.x][tmp3.x][get(tmp1, tmp2, tmp3)][0])
          dfs(2, tmp1, tmp2, tmp3, 0);
      } else if (st == 8) {
        tmp2.x = tmp3.x = tmp1.x;
        if (!vis[tmp1.x][tmp2.x][tmp3.x][get(tmp1, tmp2, tmp3)][0])
          dfs(3, tmp1, tmp2, tmp3, 0);
      }
    }
    if (abs(e.x - f.x) == 1 && !e.flagup) {
      struct node tmp1 = d, tmp2 = e, tmp3 = f;
      tmp2.flagup = 1;
      if (!st) {
        tmp3.x = tmp2.x;
        if (!vis[tmp1.x][tmp2.x][tmp3.x][get(tmp1, tmp2, tmp3)][0])
          dfs(5, tmp1, tmp2, tmp3, 0);
      } else if (st == 7) {
        tmp1.x = tmp3.x = tmp2.x;
        if (!vis[tmp1.x][tmp2.x][tmp3.x][get(tmp1, tmp2, tmp3)][0])
          dfs(6, tmp1, tmp2, tmp3, 0);
      }
    }
  }
  if (st == 1 || st == 2 || st == 3) {
    if (!d.flagth) {
      if (st == 1) {
        struct node tmp1 = d, tmp2 = e, tmp3 = f;
        tmp1.flagth = 1;
        for (int i = max(1, tmp1.x - tmp1.rg); i <= (tmp1.x + tmp1.rg); i++) {
          if (i != tmp1.x && i != tmp3.x) {
            tmp2.x = i;
            if (!vis[tmp1.x][tmp2.x][tmp3.x][get(tmp1, tmp2, tmp3)][0])
              dfs(0, tmp1, tmp2, tmp3, 0);
          }
        }
      } else if (st == 2) {
        struct node tmp1 = d, tmp2 = e, tmp3 = f;
        tmp1.flagth = 1;
        for (int i = max(1, tmp1.x - tmp1.rg); i <= (tmp1.x + tmp1.rg); i++) {
          if (i != tmp1.x && i != tmp2.x) {
            tmp3.x = i;
            if (!vis[tmp1.x][tmp2.x][tmp3.x][get(tmp1, tmp2, tmp3)][0])
              dfs(0, tmp1, tmp2, tmp3, 0);
          }
        }
      } else if (st == 3) {
        struct node tmp1 = d, tmp2 = e, tmp3 = f;
        tmp1.flagth = 1;
        for (int i = max(1, tmp1.x - tmp1.rg); i <= (tmp1.x + tmp1.rg); i++) {
          if (i != tmp1.x) {
            tmp2.x = tmp3.x = i;
            if (!vis[tmp1.x][tmp2.x][tmp3.x][get(tmp1, tmp2, tmp3)][0])
              dfs(5, tmp1, tmp2, tmp3, 0);
            if (!vis[tmp1.x][tmp2.x][tmp3.x][get(tmp1, tmp2, tmp3)][1])
              dfs(8, tmp1, tmp2, tmp3, 1);
          }
        }
      }
    }
  }
  if (st == 4 || st == 5 || st == 6) {
    if (!e.flagth) {
      if (st == 4) {
        struct node tmp1 = d, tmp2 = e, tmp3 = f;
        tmp2.flagth = 1;
        for (int i = max(1, tmp2.x - tmp2.rg); i <= tmp2.x + tmp2.rg; i++) {
          if (i != tmp2.x && i != tmp3.x) {
            tmp1.x = i;
            if (!vis[tmp1.x][tmp2.x][tmp3.x][get(tmp1, tmp2, tmp3)][0])
              dfs(0, tmp1, tmp2, tmp3, 0);
          }
        }
      } else if (st == 5) {
        struct node tmp1 = d, tmp2 = e, tmp3 = f;
        tmp2.flagth = 1;
        for (int i = max(1, tmp2.x - tmp2.rg); i <= tmp2.x + tmp2.rg; i++) {
          if (i != tmp2.x && i != tmp1.x) {
            tmp3.x = i;
            if (!vis[tmp1.x][tmp2.x][tmp3.x][get(tmp1, tmp2, tmp3)][0])
              dfs(0, tmp1, tmp2, tmp3, 0);
          }
        }
      } else if (st == 6) {
        struct node tmp1 = d, tmp2 = e, tmp3 = f;
        tmp2.flagth = 1;
        for (int i = max(1, tmp2.x - tmp2.rg); i <= tmp2.x + tmp2.rg; i++) {
          if (i != tmp2.x) {
            tmp1.x = tmp3.x = i;
            if (!vis[tmp1.x][tmp2.x][tmp3.x][get(tmp1, tmp2, tmp3)][0])
              dfs(2, tmp1, tmp2, tmp3, 0);
            if (!vis[tmp1.x][tmp2.x][tmp3.x][get(tmp1, tmp2, tmp3)][1])
              dfs(7, tmp1, tmp2, tmp3, 1);
          }
        }
      }
    }
  }
  if (st == 7 || st == 8 || st == 9) {
    if (!f.flagth) {
      if (st == 7) {
        struct node tmp1 = d, tmp2 = e, tmp3 = f;
        tmp3.flagth = 1;
        for (int i = max(1, tmp3.x - tmp3.rg); i <= (tmp3.x + tmp3.rg); i++) {
          if (i != tmp2.x && i != tmp3.x) {
            tmp1.x = i;
            if (!vis[tmp1.x][tmp2.x][tmp3.x][get(tmp1, tmp2, tmp3)][0])
              dfs(0, tmp1, tmp2, tmp3, 0);
          }
        }
      } else if (st == 8) {
        struct node tmp1 = d, tmp2 = e, tmp3 = f;
        tmp3.flagth = 1;
        for (int i = max(1, tmp3.x - tmp3.rg); i <= (tmp3.x + tmp3.rg); i++) {
          if (i != tmp1.x && i != tmp3.x) {
            tmp2.x = i;
            if (!vis[tmp1.x][tmp2.x][tmp3.x][get(tmp1, tmp2, tmp3)][0])
              dfs(0, tmp1, tmp2, tmp3, 0);
          }
        }
      } else if (st == 9) {
        struct node tmp1 = d, tmp2 = e, tmp3 = f;
        tmp3.flagth = 1;
        for (int i = max(1, tmp3.x - tmp3.rg); i <= (tmp3.x + tmp3.rg); i++) {
          if (i != tmp3.x) {
            tmp1.x = tmp2.x = i;
            if (!vis[tmp1.x][tmp2.x][tmp3.x][get(tmp1, tmp2, tmp3)][0])
              dfs(1, tmp1, tmp2, tmp3, 0);
            if (!vis[tmp1.x][tmp2.x][tmp3.x][get(tmp1, tmp2, tmp3)][1])
              dfs(4, tmp1, tmp2, tmp3, 1);
          }
        }
      }
    }
  }
  return;
}
int main() {
  while (~scanf("%d%d%d%d%d%d%d%d%d", &a.x, &a.mv, &a.rg, &b.x, &b.mv, &b.rg,
                &c.x, &c.mv, &c.rg)) {
    memset(vis, 0, sizeof(vis));
    a.flagmv = a.flagth = a.flagup = b.flagmv = b.flagth = b.flagup = c.flagmv =
        c.flagth = c.flagup = 0;
    ans = 0;
    dfs(0, a, b, c, 0);
    printf("%d\n", ans);
  }
  return 0;
}
