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 JAVA):

Solution:

import java.util.*;
import java.math.*;
import static java.lang.Character.isDigit;
import static java.lang.Character.isLowerCase;
import static java.lang.Character.isUpperCase;
import static java.lang.Math.*;
import static java.math.BigInteger.*;
import static java.util.Arrays.*;
import static java.util.Collections.*;
import static java.lang.Character.isDigit;

public class Main{
    static void debug(Object...os){
        System.err.println(deepToString(os));
    }
    int[] maxMove=new int[3];
    int[] power=new int[3];
    void run(){
        E init = new E();
        init.xs=new int[3];
        for(int i=0;i<3;i++) {
            init.xs[i]=nextInt();maxMove[i]=nextInt();power[i]=nextInt();
        }
        init.lift=new int[3];
        fill(init.lift,-1);
        init.lifted=new boolean[3];
        init.throwed=new boolean[3];
        init.moved=new boolean[3];
        dfs(init);
        System.out.println(res);
    }
    int res = 0;
    HashSet<Long> set=new HashSet<Long>();
    void dfs(E e) {
        if(set.contains(e.hash()))return;
        set.add(e.hash());
        if(e.reachable()<res)return;
        res = max(res,e.getmaxX());
        for(int i=0;i<3;i++) {
            // move
            boolean ok=true;
            if(e.moved[i])ok=false;
            if(e.lift[i]!=-1)ok=false;
            if(e.lifted[i])ok=false;
            if(ok) {
                ArrayList<Integer> cand = new ArrayList<Integer>();
                cand.add(e.xs[i]-maxMove[i]);
                cand.add(e.xs[i]+maxMove[i]);
                for(int j=0;j<3;j++)if(i!=j)cand.add(e.xs[j]-1);
                for(int j=0;j<3;j++)if(i!=j)cand.add(e.xs[j]+1);
                for(int j : cand)if(e.xs[i]-maxMove[i]<=j && j<=e.xs[i]+maxMove[i]) {
//              for(int j=e.xs[i]-maxMove[i];j<=e.xs[i]+maxMove[i];j++) {
                    if(j<0)continue;
                    E ne = e.myClone();
                    ne.xs[i] = j;
                    ne.moved[i] = true;
                    dfs(ne);
                }
            }
            // lift
            ok=true;
            if(e.throwed[i])ok=false;
            if(e.lift[i]!=-1)ok=false;
            if(e.lifted[i])ok=false;
            if(ok)for(int j=0;j<3;j++)if(i!=j) {
                if(abs(e.xs[i]-e.xs[j])!=1)continue;
                if(e.lifted[j])continue;
                E ne = e.myClone();
                ne.lift[i] = j;
                ne.lifted[j] = true;
                dfs(ne);
            }
            // throw
            ok=true;
            if(e.lifted[i])ok=false;
            if(e.lift[i]==-1)ok=false;
            if(ok) {
                assert !e.throwed[i];
//              ArrayList<Integer> cand = new ArrayList<Integer>();
//              cand.add(e.xs[i]-power[i]);
//              cand.add(e.xs[i]+power[i]);
//              for(int j=0;j<3;j++)if(i!=j)cand.add(e.xs[j]-1);
//              for(int j=0;j<3;j++)if(i!=j)cand.add(e.xs[j]+1);
//              for(int j:cand)if(e.xs[i]-power[i]<=j && j<=e.xs[i]+power[i]){
                for(int j=e.xs[i]-power[i];j<=e.xs[i]+power[i];j++) {
                    if(j<0)continue;
                    E ne = e.myClone();
                    ne.xs[ne.lift[i]] = j;
                    ne.lifted[ne.lift[i]] = false;
                    ne.lift[i] = -1;
                    ne.throwed[i] = true;
                    dfs(ne);
                }
            }
        }
    }
    
    class E{
        int[] xs;
        int[] lift;
        boolean[] lifted;
        boolean[] moved;
        boolean[] throwed;
        E myClone() {
            E res=new E();
            res.xs = xs.clone();
            res.lift=lift.clone();
            res.lifted=lifted.clone();
            res.moved=moved.clone();
            res.throwed=throwed.clone();
            return res;
        }
        public int reachable(){
            int x=getmaxX();
            for(int i=0;i<3;i++) {
                if(!moved[i])x += maxMove[i];
                if(!throwed[i])x += power[i];
            }
            return x;
        }
        public int getmaxX(){
            int res=Integer.MIN_VALUE;
            for(int x:xs)res=max(res,x);
            return res;
        }
        long hash=-1;
        long hash() {
            if(hash!=-1)return hash;
            hash=0;
            for(int x:xs)hash=hash<<6|x;
            for(int x:lift)hash=hash<<2|x+1;
            for(boolean b:lifted)hash=hash<<1|(b?1:0);
            for(boolean b:moved)hash=hash<<1|(b?1:0);
            for(boolean b:throwed)hash=hash<<1|(b?1:0);
            return hash;
        }
        
        public int hashCode(){
            final int prime=31;
            int result=1;
            result=prime*result+getOuterType().hashCode();
            result=prime*result+Arrays.hashCode(lift);
            result=prime*result+Arrays.hashCode(lifted);
            result=prime*result+Arrays.hashCode(moved);
            result=prime*result+Arrays.hashCode(throwed);
            result=prime*result+Arrays.hashCode(xs);
            return result;
        }
        public String toString(){
            return "E [lift="+Arrays.toString(lift)+", lifted="+Arrays.toString(lifted)+", moved="
            +Arrays.toString(moved)+", throwed="+Arrays.toString(throwed)+", xs="+Arrays.toString(xs)+"]";
        }
        public boolean equals(Object obj){
            if(this==obj) return true;
            if(obj==null) return false;
            if(getClass()!=obj.getClass()) return false;
            E other=(E)obj;
            if(!getOuterType().equals(other.getOuterType())) return false;
            if(!Arrays.equals(lift,other.lift)) return false;
            if(!Arrays.equals(lifted,other.lifted)) return false;
            if(!Arrays.equals(moved,other.moved)) return false;
            if(!Arrays.equals(throwed,other.throwed)) return false;
            if(!Arrays.equals(xs,other.xs)) return false;
            return true;
        }
        private Main getOuterType(){
            return Main.this;
        }
        
    }
    
    int nextInt(){
        try{
            int c=System.in.read();
            if(c==-1) return c;
            while(c!='-'&&(c<'0'||'9'<c)){
                c=System.in.read();
                if(c==-1) return c;
            }
            if(c=='-') return -nextInt();
            int res=0;
            do{
                res*=10;
                res+=c-'0';
                c=System.in.read();
            }while('0'<=c&&c<='9');
            return res;
        }catch(Exception e){
            return -1;
        }
    }
    
    long nextLong(){
        try{
            int c=System.in.read();
            if(c==-1) return -1;
            while(c!='-'&&(c<'0'||'9'<c)){
                c=System.in.read();
                if(c==-1) return -1;
            }
            if(c=='-') return -nextLong();
            long res=0;
            do{
                res*=10;
                res+=c-'0';
                c=System.in.read();
            }while('0'<=c&&c<='9');
            return res;
        }catch(Exception e){
            return -1;
        }
    }
    
    double nextDouble(){
        return Double.parseDouble(next());
    }
    
    String next(){
        try{
            StringBuilder res=new StringBuilder("");
            int c=System.in.read();
            while(Character.isWhitespace(c))
                c=System.in.read();
            do{
                res.append((char)c);
            }while(!Character.isWhitespace(c=System.in.read()));
            return res.toString();
        }catch(Exception e){
            return null;
        }
    }
    
    String nextLine(){
        try{
            StringBuilder res=new StringBuilder("");
            int c=System.in.read();
            while(c=='\r'||c=='\n')
                c=System.in.read();
            do{
                res.append((char)c);
                c=System.in.read();
            }while(c!='\r'&&c!='\n');
            return res.toString();
        }catch(Exception e){
            return null;
        }
    }
    public static void main(String[] args){
        new Main().run();
    }
}