using System; using static System.Console; using System.Linq; using System.Collections.Generic; using System.Security.Cryptography; class Program { static int NN => int.Parse(ReadLine()); static long[] NList => ReadLine().Split().Select(long.Parse).ToArray(); public static void Main() { Solve(); } static void Solve() { var c = NList; var (ax, bx, cx) = (c[0], c[1], c[2]); var s = ReadLine().Split(); var sn = int.Parse(s[1]); var t = ReadLine().Split(); var tn = int.Parse(t[1]); // s,t,A1,Ax,B1,Bx,C1,Cx var n = 8; var tree = new List<(int to, long len)>[n]; for (var i = 0; i < n; ++i) tree[i] = new List<(int to, long len)>(); if (s[0] == t[0]) { AddEdge(tree, 0, 1, Math.Abs(sn - tn)); } AddEdge(tree, 2, 3, ax - 1); AddEdge(tree, 4, 5, bx - 1); AddEdge(tree, 6, 7, cx - 1); AddEdge(tree, 2, 4, 1); AddEdge(tree, 2, 6, 1); AddEdge(tree, 4, 6, 1); AddEdge(tree, 3, 5, 1); AddEdge(tree, 3, 7, 1); AddEdge(tree, 5, 7, 1); if (s[0] == "A") { AddEdge(tree, 0, 2, sn - 1); AddEdge(tree, 0, 3, ax - sn); } else if (s[0] == "B") { AddEdge(tree, 0, 4, sn - 1); AddEdge(tree, 0, 5, bx - sn); } else { AddEdge(tree, 0, 6, sn - 1); AddEdge(tree, 0, 7, cx - sn); } if (t[0] == "A") { AddEdge(tree, 1, 2, tn - 1); AddEdge(tree, 1, 3, ax - tn); } else if (t[0] == "B") { AddEdge(tree, 1, 4, tn - 1); AddEdge(tree, 1, 5, bx - tn); } else { AddEdge(tree, 1, 6, tn - 1); AddEdge(tree, 1, 7, cx - tn); } var INF = long.MaxValue / 2; var len = Enumerable.Repeat(INF, n).ToArray(); len[0] = 0; var pq = new PriorityQueue<(int pos, long len), long>(); pq.Enqueue((0, 0), 0); while (pq.Count > 0) { var cur = pq.Dequeue(); if (len[cur.pos] != cur.len) continue; foreach (var next in tree[cur.pos]) { if (len[next.to] <= cur.len + next.len) continue; len[next.to] = cur.len + next.len; pq.Enqueue((next.to, len[next.to]), len[next.to]); } } WriteLine(len[1]); } static void AddEdge(List<(int to, long len)>[] tree, int f, int t, long len) { tree[f].Add((t, len)); tree[t].Add((f, len)); } }