#include <bits/stdc++.h>
using namespace std;
using namespace std;
const int MaxN = 3, NA = -1, MaxC = 111;
enum { MOVE = 1, TAKE = 2, THROW = 4 };
struct data {
  unsigned short used;
  signed char p[MaxN];
  signed char holds[MaxN];
};
union state {
  data d;
  long long c;
};
bool operator<(state a, state b) { return a.c < b.c; }
int m[MaxN], p[MaxN], t[MaxN];
int used[MaxN];
int holds[MaxN];
int hangs[MaxN];
int res;
set<state> s;
inline bool good(int np) {
  int t;
  t = abs(np - p[0]);
  if (t == 1 || t == 2) return true;
  t = abs(np - p[1]);
  if (t == 1 || t == 2) return true;
  t = abs(np - p[2]);
  if (t == 1 || t == 2) return true;
  return false;
}
void recur(void) {
  int i, j, np, rem1;
  res = max(max(p[0], p[1]), max(p[2], res));
  {
    state z;
    z.d.used = (used[0] << 6) + (used[1] << 3) + (used[2] << 0);
    z.d.p[0] = p[0];
    z.d.p[1] = p[1];
    z.d.p[2] = p[2];
    z.d.holds[0] = holds[0];
    z.d.holds[1] = holds[1];
    z.d.holds[2] = holds[2];
    if (s.find(z) != s.end()) return;
    s.insert(z);
  }
  for (i = 0; i < MaxN; i++) {
    if (!(used[i] & MOVE) && holds[i] == NA && hangs[i] == NA)
      for (j = -m[i]; j <= +m[i]; j++) {
        np = p[i] + j;
        if (abs(j) == m[i] || good(np)) {
          rem1 = p[i];
          p[i] = np;
          used[i] ^= MOVE;
          recur();
          used[i] ^= MOVE;
          p[i] = rem1;
        }
      }
    if (!(used[i] & TAKE) && holds[i] == NA && hangs[i] == NA)
      for (j = 0; j < MaxN; j++)
        if (abs(p[i] - p[j]) == 1) {
          rem1 = p[j];
          p[j] = -MaxC;
          holds[i] = j;
          hangs[j] = i;
          used[i] ^= TAKE;
          recur();
          used[i] ^= TAKE;
          holds[i] = NA;
          hangs[j] = NA;
          p[j] = rem1;
        }
    if (!(used[i] & THROW) && holds[i] != NA && hangs[i] == NA)
      for (j = -t[i]; j <= +t[i]; j++) {
        np = p[i] + j;
        if (abs(j) == t[i] || good(np)) {
          rem1 = holds[i];
          p[rem1] = np;
          hangs[rem1] = NA;
          holds[i] = NA;
          used[i] ^= THROW;
          recur();
          used[i] ^= THROW;
          holds[i] = rem1;
          hangs[rem1] = i;
          p[rem1] = -MaxC;
        }
      }
  }
}
int main(void) {
  int i;
  while (1) {
    for (i = 0; i < MaxN; i++) {
      used[i] = 0;
      holds[i] = NA;
      hangs[i] = NA;
      if (scanf(" %d %d %d", &p[i], &m[i], &t[i]) != 3) break;
    }
    if (i < MaxN) break;
    res = 0;
    recur();
    printf("%d\n", res);
  }
  return 0;
}
