#include <bits/stdc++.h>
using namespace std;
const int MOD = (1 << 23) - 1;
const int HASH_STP = 131;
struct node {
  int S[3], head[3], pos[3];
  node() {
    memset(S, 0, sizeof S);
    memset(head, -1, sizeof head);
    memset(pos, -1, sizeof pos);
  }
  unsigned long long getHash() {
    unsigned long long ret = 0;
    for (int i = 0; i < 3; i++) ret = ret * 131 + pos[i] + 2;
    for (int i = 0; i < 3; i++) ret = ret * 131 + S[i] + 2;
    for (int i = 0; i < 3; i++) ret = ret * 131 + head[i] + 2;
    return ret;
  }
};
int mov_range[3], thr_range[3];
struct HashMap {
  unsigned long long Hash_d[MOD + 10];
  int Hash_r[MOD + 10];
  int& operator[](const unsigned long long& rhs) {
    unsigned long long pos = rhs & MOD;
    while (Hash_d[pos] && Hash_r[pos] && Hash_d[pos] != rhs)
      pos = (pos + HASH_STP) & MOD;
    Hash_d[pos] = rhs;
    return Hash_r[pos];
  }
} mp;
int ans;
void dfs(node cur) {
  if (mp[cur.getHash()]) return;
  mp[cur.getHash()] = 1;
  for (int i = 0; i < 3; i++) ans = max(ans, cur.pos[i]);
  for (int i = 0; i < 3; i++) {
    if (cur.head[i] != -1 || cur.pos[i] == -1) continue;
    if (cur.S[i] & 1) continue;
    for (int j = -mov_range[i]; j <= mov_range[i]; j++) {
      int nexp = cur.pos[i] + j;
      if (nexp <= 0) continue;
      if (nexp == cur.pos[0] || nexp == cur.pos[1] || nexp == cur.pos[2])
        continue;
      node nex = cur;
      nex.pos[i] = nexp;
      nex.S[i] |= 1;
      dfs(nex);
    }
  }
  for (int i = 0; i < 3; i++) {
    if (cur.head[i] != -1 || cur.pos[i] == -1) continue;
    if (cur.S[i] & 2) continue;
    for (int j = 0; j < 3; j++) {
      if (cur.pos[j] == -1) continue;
      if (abs(cur.pos[i] - cur.pos[j]) != 1) continue;
      node nex = cur;
      nex.pos[j] = -1;
      nex.head[i] = j;
      nex.S[i] |= 2;
      dfs(nex);
    }
  }
  for (int i = 0; i < 3; i++) {
    if (cur.head[i] == -1 || cur.pos[i] == -1) continue;
    for (int j = -thr_range[i]; j <= thr_range[i]; j++) {
      int nexp = cur.pos[i] + j;
      if (nexp <= 0) continue;
      if (nexp == cur.pos[0] || nexp == cur.pos[1] || nexp == cur.pos[2])
        continue;
      node nex = cur;
      nex.pos[cur.head[i]] = nexp;
      nex.head[i] = -1;
      dfs(nex);
    }
  }
}
int main() {
  node beg;
  for (int i = 0; i < 3; i++)
    scanf("%d%d%d", &beg.pos[i], &mov_range[i], &thr_range[i]);
  dfs(beg);
  printf("%d\n", ans);
  return 0;
}
