#include <bits/stdc++.h>
#pragma comment(linker, "/stack:640000000")
using namespace std;
const double EPS = 1e-9;
const int INF = 0x7f7f7f7f;
const double PI = acos(-1.0);
template <class T>
inline T _abs(T n) {
  return ((n) < 0 ? -(n) : (n));
}
template <class T>
inline T _max(T a, T b) {
  return (!((a) < (b)) ? (a) : (b));
}
template <class T>
inline T _min(T a, T b) {
  return (((a) < (b)) ? (a) : (b));
}
template <class T>
inline T _swap(T &a, T &b) {
  a = a ^ b;
  b = a ^ b;
  a = a ^ b;
}
template <class T>
inline T gcd(T a, T b) {
  return (b) == 0 ? (a) : gcd((b), ((a) % (b)));
}
template <class T>
inline T lcm(T a, T b) {
  return ((a) / gcd((a), (b)) * (b));
}
struct debugger {
  template <typename T>
  debugger &operator,(const T &v) {
    cerr << v << " ";
    return *this;
  }
} dbg;
template <typename F, typename S>
ostream &operator<<(ostream &os, const pair<F, S> &p) {
  return os << "(" << p.first << ", " << p.second << ")";
}
template <typename T>
ostream &operator<<(ostream &os, const vector<T> &v) {
  os << "{";
  typename vector<T>::const_iterator it;
  for (it = v.begin(); it != v.end(); it++) {
    if (it != v.begin()) os << ", ";
    os << *it;
  }
  return os << "}";
}
template <typename T>
ostream &operator<<(ostream &os, const set<T> &v) {
  os << "[";
  typename set<T>::const_iterator it;
  for (it = v.begin(); it != v.end(); it++) {
    if (it != v.begin()) os << ", ";
    os << *it;
  }
  return os << "]";
}
template <typename F, typename S>
ostream &operator<<(ostream &os, const map<F, S> &v) {
  os << "[";
  typename map<F, S>::const_iterator it;
  for (it = v.begin(); it != v.end(); it++) {
    if (it != v.begin()) os << ", ";
    os << it->first << " = " << it->second;
  }
  return os << "]";
}
int Set(int N, int pos) { return N = N | (1 << pos); }
int reset(int N, int pos) { return N = N & ~(1 << pos); }
bool check(int N, int pos) { return (bool)(N & (1 << pos)); }
int a[2][54], b[54], n;
int dp1[4][54][2], dp2[4][54][2][54];
int visited[4][54];
int call2(int r, int c, int ave, int diff) {
  if (r == 1 && c == n - 1) {
    if (ave == 0) return INF;
    if (diff == 0) return INF;
    return 0;
  }
  if (r >= n) return INF;
  if (c >= n) return INF;
  if (dp2[r][c][ave][diff] != -1) return dp2[r][c][ave][diff];
  int s1, s2;
  s1 = s2 = INF;
  if (ave == 0) {
    if (visited[r][c] == 0)
      s1 = b[c] + call2(r + 1, c, 1, diff + 1);
    else
      s1 = b[c] + call2(r + 1, c, 1, diff);
  }
  if (c < n - 1) {
    if (visited[r][c] == 0)
      s2 = a[r][c] + call2(r, c + 1, ave, diff + 1);
    else
      s2 = a[r][c] + call2(r, c + 1, ave, diff);
  }
  return dp2[r][c][ave][diff] = min(s1, s2);
}
int call1(int r, int c, int ave) {
  if (r == 0 && c == 0) {
    if (ave == 0) return INF;
    memset(dp2, -1, sizeof(dp2));
    {
      int d = call2(0, 0, 0, 0);
      return d;
    }
  }
  if (r < 0) return INF;
  if (c < 0) return INF;
  visited[r][c] = 1;
  int s1, s2;
  s1 = INF, s2 = INF;
  if (ave == 0) {
    s1 = b[c] + call1(r - 1, c, 1);
  }
  if (c > 0) {
    s2 = a[r][c - 1] + call1(r, c - 1, ave);
  };
  visited[r][c] = 0;
  return dp1[r][c][ave] = min(s1, s2);
}
int main() {
  while (~scanf("%d", &n)) {
    memset(visited, 0, sizeof(visited));
    visited[0][0] = 1;
    visited[1][n - 1] = 1;
    for (int i = 0; i < 2; i++) {
      for (int j = 0; j < n - 1; j++) {
        scanf("%d", &a[i][j]);
      }
    }
    for (int i = 0; i < n; i++) {
      scanf("%d", &b[i]);
    }
    printf("%d\n", call1(1, n - 1, 0));
  }
  return 0;
}
