Problem: You are given a straight half-line divided into segments of unit length, which we will call positions. The positions are numbered by positive integers that start with 1 from the end of half-line, i. e. 1, 2, 3 and so on. The distance between the positions is the absolute difference between the respective numbers. 

Laharl, Etna and Flonne occupy some positions on the half-line and they want to get to the position with the largest possible number. They are originally placed in different positions. 

Each of the characters can perform each of the following actions no more than once: 

  * Move a certain distance. 
  * Grab another character and lift him above the head. 
  * Throw the lifted character a certain distance. 



Each character has a movement range parameter. They can only move to free positions, assuming that distance between those positions doesn't exceed the movement range. 

One character can lift another character if the distance between the two characters equals 1, and no one already holds that another character. We can assume that the lifted character moves to the same position as the person who has lifted him, and the position in which he stood before becomes free. A lifted character cannot perform any actions and the character that holds him cannot walk. 

Also, each character has a throwing range parameter. It is the distance at which this character can throw the one lifted above his head. He can only throw a character to a free position, and only when there is a lifted character. 

We accept the situation when one person grabs another one who in his turn has the third character in his hands. This forms a "column" of three characters. For example, Laharl can hold Etna while Etna holds Flonne. In this case, Etna and the Flonne cannot perform any actions, and Laharl can only throw Etna (together with Flonne) at some distance. 

Laharl, Etna and Flonne perform actions in any order. They perform actions in turns, that is no two of them can do actions at the same time.

Determine the maximum number of position at least one of the characters can reach. That is, such maximal number x so that one of the characters can reach position x.

Input

The first line contains three integers: Laharl's position, his movement range and throwing range. The second and the third lines describe Etna's and Flonne's parameters correspondingly in the similar form. It is guaranteed that the three characters occupy distinct positions. All numbers in the input are between 1 and 10, inclusive.

Output

Print a single number — the maximum ordinal number of position which either Laharl, Etna or Flonne can reach.

Examples

Input

9 3 3
4 3 1
2 3 3


Output

15

Note

Let us explain how to reach position 15 in the sample.

Initially Laharl occupies position 9, Etna — position 4 and Flonne — position 2.

First Laharl moves to position 6.

Then Flonne moves to position 5 and grabs Etna.

Laharl grabs Flonne and throws to position 9.

Flonne throws Etna to position 12.

Etna moves to position 15.

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
void ASS(bool b) {
  if (!b) {
    ++*(int*)0;
  }
}
struct Man {
  char msk, pos, u;
  Man() {
    msk = pos = 0;
    u = -1;
  }
};
enum EEE { eThrow = 1, eGo = 2, eTake = 4 };
struct State {
  Man s[3];
  State Throw(int x, int newpos) const {
    ASS(s[x].u != -1);
    State res = *this;
    res.s[x].u = -1;
    res.s[x].msk |= eThrow;
    int y = s[x].u;
    res.s[y].pos = newpos;
    if (s[y].u != -1) res.s[s[y].u].pos = newpos;
    return res;
  }
  bool used(int x) const {
    for (int i = 0; i < (int)(3); i++)
      if (s[i].u == x) return 1;
    return 0;
  }
  bool canGo(int x) const {
    return (s[x].msk & eGo) == 0 && s[x].u == -1 && !used(x);
  }
  bool canTake(int x) const { return (s[x].msk & eTake) == 0 && !used(x); }
  bool canThrow(int x) const {
    return (s[x].msk & eThrow) == 0 && s[x].u != -1 && !used(x);
  }
  State move(int x, int newpos) const {
    State res = *this;
    res.s[x].u = -1;
    res.s[x].msk |= eGo;
    res.s[x].pos = newpos;
    return res;
  }
  State take(int x, int y) const {
    State res = *this;
    res.s[x].msk |= eTake;
    res.s[x].u = y;
    res.s[y].pos = s[x].pos;
    if (s[y].u != -1) res.s[s[y].u].pos = s[x].pos;
    return res;
  }
  bool free(int pos) const {
    return s[0].pos != pos && s[1].pos != pos && s[2].pos != pos;
  }
  int best() const { return max(s[0].pos, max(s[1].pos, s[2].pos)); }
  long long ID() const {
    long long res = 0;
    for (int i = 0; i < (int)(3); i++) {
      res = (res << 6) + s[i].pos;
      res = (res << 3) + s[i].msk;
      res = (res << 2) + s[i].u + 1;
    }
    return res;
  }
};
int dx[4];
int dy[4];
const int HS = 1 << 21;
struct HM {
  int ht[HS];
  struct node {
    long long x;
    int next;
    int b;
  };
  vector<node> h;
  HM() {
    h.resize(1);
    h.reserve(HS);
  }
  int& getBool(long long x) {
    int hh = ((x >> 16) ^ x) & (HS - 1);
    for (int t = ht[hh]; t; t = h[t].next)
      if (h[t].x == x) return h[t].b;
    int id = (int)h.size();
    h.resize(id + 1);
    node& nd = h.back();
    nd.x = x;
    nd.b = 0;
    nd.next = ht[hh];
    ht[hh] = id;
    return nd.b;
  }
} mp;
queue<State> q;
int ans = 0;
void add(const State& s) {
  int& b = mp.getBool(s.ID());
  if (b) return;
  b = 1;
  ans = max(ans, s.best());
  q.push(s);
}
int main() {
  State x;
  for (int i = 0; i < (int)(3); i++) {
    x.s[i].msk = 0;
    x.s[i].u = -1;
    int pos;
    cin >> pos >> dx[i] >> dy[i];
    x.s[i].pos = pos;
  }
  add(x);
  while (!q.empty()) {
    x = q.front();
    if (x.s[0].pos == 6 && x.s[2].pos == 5) {
      x = x;
    }
    q.pop();
    for (int i = 0; i < (int)(3); i++) {
      if (x.canGo(i)) {
        for (int newpos = max(1, x.s[i].pos - dx[i]);
             newpos <= x.s[i].pos + dx[i]; newpos++) {
          if (x.free(newpos)) add(x.move(i, newpos));
        }
      }
      if (x.canTake(i)) {
        for (int j = 0; j < (int)(3); j++)
          if (i != j) {
            int k = 3 - i - j;
            int z = j;
            if (x.s[k].pos == x.s[j].pos && x.s[k].u != -1) z = k;
            if (x.s[z].pos + 1 == x.s[i].pos || x.s[z].pos - 1 == x.s[i].pos) {
              add(x.take(i, z));
            }
          }
      }
      if (x.canThrow(i)) {
        for (int newpos = max(1, x.s[i].pos - dy[i]);
             newpos <= x.s[i].pos + dy[i]; newpos++)
          if (x.free(newpos)) add(x.Throw(i, newpos));
      }
    }
  }
  cout << ans << endl;
  return 0;
}