#include using namespace std; using ll = long long; #define rep(i,a,b) for(ll i = a; i < (b); i++) int main() { int n; cin >> n; ll sum = 0; vector a(n), b(n), c(n), p(n); rep(i, 0, n) cin >> a[i], sum += a[i]; rep(i, 1, n) cin >> b[i]; rep(i, 1, n) cin >> c[i]; rep(i, 1, n) cin >> p[i], p[i]--; vector> use(n); rep(i,0,n) use[i].insert(1); rep(i,0,n) use[i].insert(a[i]); rep(i,1,n) { use[i].insert(b[i]); use[p[i]].insert(c[i]); } map, int> mp; ll gn = 0; rep(i,0,n){ for(auto x: use[i]) { mp[{i,x}] = gn++; } } vector>> g(gn); rep(i,0,n){ int bef = -1; for(auto x: use[i]) { if(bef == -1) { bef = x; continue; } g[mp[{i,x}]].push_back({mp[{i,bef}], x-bef}); g[mp[{i,bef}]].push_back({mp[{i,x}], x-bef}); bef = x; } } rep(i,1,n){ g[mp[{p[i], c[i]}]].push_back({mp[{i, b[i]}], 1}); g[mp[{i, b[i]}]].push_back({mp[{p[i], c[i]}], 1}); } ll ans = 0; const ll mod = 998244353; auto inv = [&](ll a) -> ll { ll x = mod-2; ll res = 1; while(x > 0){ if(x&1) res = res * a % mod; a = a * a % mod; x >>= 1; } return res; }; auto dfs = [&](auto&& self, int nw, int par) -> ll { ll now = 1; for(auto to: g[nw]) { if(to[0] == par) continue; now += self(self, to[0], nw) + to[1]-1; } for(auto to: g[nw]) { if(to[0] == par) { ll here = now; ll there = sum - here - (to[1] - 1); ans += (to[1]%mod) * (here%mod) % mod * (there%mod) % mod; ans += (to[1] % mod) * ((to[1]-1) % mod) % mod * ((here+there)%mod) % mod * inv(2) % mod; ans += ((to[1]-2)%mod) * ((to[1]-1)%mod) % mod * ((to[1])%mod) % mod * inv(6) % mod; ans %= mod; } } return now; }; dfs(dfs, 0, -1); cout << ans*2%mod << endl; }