#include <bits/stdc++.h>
using namespace std;
struct P {
  int x[3], h[3], mask;
  P() {
    memset(h, -1, sizeof h);
    mask = 0;
  }
  bool operator<(const P &a) const {
    for (int i = 0; i < 3; ++i)
      if (x[i] != a.x[i]) return x[i] < a.x[i];
    for (int i = 0; i < 3; ++i)
      if (h[i] != a.h[i]) return h[i] < a.h[i];
    return mask < a.mask;
  }
  bool operator==(const P &a) const {
    for (int i = 0; i < 3; ++i)
      if (x[i] != a.x[i]) return false;
    for (int i = 0; i < 3; ++i)
      if (h[i] != a.h[i]) return false;
    return mask == a.mask;
  }
};
queue<P> Q;
set<P> store;
int Throw[3], Move[3], Catch[3];
int throwRange[3], moveRange[3], result;
void add(const P &a) {
  if (store.count(a)) return;
  Q.push(a);
  store.insert(a);
  for (int i = 0; i < 3; ++i) result = max(result, a.x[i]);
}
int main() {
  P initState;
  int cnt = 0;
  result = 0;
  for (int i = 0; i < 3; ++i) {
    int initPos;
    scanf("%d%d%d", &initPos, &moveRange[i], &throwRange[i]);
    initState.x[i] = initPos;
    Move[i] = cnt++;
    Catch[i] = cnt++;
    Throw[i] = cnt++;
  }
  add(initState);
  while (!Q.empty()) {
    bool catched[3] = {false, false, false};
    P cur(Q.front());
    Q.pop();
    for (int i = 0; i < 3; ++i)
      if (cur.h[i] >= 0) catched[cur.h[i]] = true;
    int mask = cur.mask;
    for (int i = 0; i < 3; ++i) {
      if (catched[i]) continue;
      if (!(mask & 1 << Move[i]) && cur.h[i] == -1) {
        for (int d = 1; d <= moveRange[i]; ++d) {
          for (int dir = 0; dir < 2; ++dir) {
            int dd = cur.x[i] + d * (dir * 2 - 1);
            bool good = dd > 0;
            for (int k = 0; k < 3 && good; ++k) {
              if (i != k && !catched[k] && cur.x[k] == dd) {
                good = false;
              }
            }
            if (good) {
              P next(cur);
              next.x[i] = dd;
              next.mask |= 1 << Move[i];
              add(next);
            }
          }
        }
      }
      if (!(mask & 1 << Catch[i]) && cur.h[i] == -1) {
        for (int k = 0; k < 3; ++k) {
          if (k != i && !catched[k] && abs(cur.x[k] - cur.x[i]) == 1) {
            P next(cur);
            next.h[i] = k;
            next.mask |= 1 << Catch[i];
            add(next);
          }
        }
      }
      if (cur.h[i] >= 0 && !(mask & 1 << Throw[i])) {
        int j = cur.h[i];
        int k = cur.h[j];
        for (int d = 1; d <= throwRange[i]; ++d) {
          for (int dir = 0; dir < 2; ++dir) {
            int x2 = cur.x[i] + d * (dir * 2 - 1), x3;
            if (k >= 0) {
              x3 = x2 + cur.x[k] - cur.x[j];
              if (x2 != cur.x[i] && x2 > 0) {
                P next(cur);
                next.h[i] = -1;
                next.x[j] = x2;
                next.x[k] = x3;
                next.mask |= 1 << Throw[i];
                add(next);
              }
            } else {
              bool good = x2 > 0;
              for (int k = 0; k < 3 && good; ++k) {
                if (k != j && !catched[k] && cur.x[k] == x2) {
                  good = false;
                }
              }
              if (good) {
                P next(cur);
                next.h[i] = -1;
                next.x[j] = x2;
                next.mask |= 1 << Throw[i];
                add(next);
              }
            }
          }
        }
      }
    }
  }
  printf("%d\n", result);
  return 0;
}
