//
// Created by matjaz on 4/19/26.
//
#include<iostream>
#include <map>
#include<vector>
using namespace std;
map<pair<int,int>, bool> dp;
map<int,vector<int> > sets;
vector<int> sums;
int N,M;
vector<int> a,b;
bool subset(int A,int B) {
return (A & B) == A;
}
bool possible(int s, int x) {
//cout << s << " " << x << endl;
if (x == N) { return true;}
if (dp.count(make_pair(s,x)) == 0) {
bool res = false;
vector<int> v = sets[a[x]];
for (int i=0;i<v.size();i++) {
if (subset(v[i], s)) {
res = res || possible(s ^ v[i], x + 1);
}
}
return dp[make_pair(s,x)] = res;
} else return dp[make_pair(s,x)];
}
int main() {
cin >> N >> M;
a.assign(N, 0);
b.assign(M, 0);
for (int i=0;i<N;i++) {cin >> a[i];}
for (int i=0;i<M;i++) {cin >> b[i];}
for (int i=0;i<N;i++) {
if (sets.find(a[i]) == sets.end()) {sets[a[i]]= vector<int>();}
}
sums.assign(1<<M, 0);
sums[0] = 0;
for (int i=1;i<1<<M;i++) {
int removed = i & -i;
sums[i] = sums[i ^ removed] + b[__builtin_ctz(removed)];
if (sets.count(sums[i]) == 1) {
sets[sums[i]].push_back(i);
}
}
cout << (possible((1<<M) - 1,0) ? "YES" : "NO") << endl;
return 0;
}