#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <numeric>

#define REP(i, a, b) for (int i = int(a); i < int(b); i++)
#ifdef _DEBUG_
#define dump(val) cerr << __LINE__ << ":\t" << #val << " = " << (val) << endl
#else
#define dump(val)
#endif

using namespace std;

typedef long long int ll;

template<typename T>
vector<T> make_v(size_t a, T b) {
    return vector<T>(a, b);
}
template<typename... Ts>
auto make_v(size_t a, Ts... ts) {
    return vector<decltype(make_v(ts...))>(a, make_v(ts...));
}

int string2int(string s) {
    return atoi(s.c_str());
}

vector<int> parseInputs(string &s) {
    vector<int> res;
    s += " ";
    int lst = 0;
    REP(i, 0, s.size()) {
        if (s[i] == ' ') {
            res.push_back(string2int(s.substr(lst, i - lst)));
            lst = i + 1;
        }
    }
    return res;
}

#include <cmath>
double calcDist(double r1, double r2) {
    return sqrt(r1 * r1 - r2 * r2);
}

int main() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    string s;
    while (true) {
        getline(cin, s);
        if (s.size() == 0) break;
        auto res = parseInputs(s);
        int W = res[0];
        res.erase(res.begin());
        int n = res.size();
        auto dp = make_v(1 << n, n, 1e+15);
        REP(i, 0, n) {
            dp[1 << i][i] = res[i];
        }
        REP(i, 1, 1 << n) {
            REP(j, 0, n) {
                if (!((i >> j) & 1)) continue;
                REP(k, 0, n) {
                    if ((i >> k) & 1) continue;
                    double dist = calcDist(res[j] + res[k], abs(res[j] - res[k]));
                    int nxt = i | (1 << k);
                    dp[nxt][k] = min(dp[nxt][k], dp[i][j] + dist);
                }
            }
        }
        double ans = 1e+15;
        REP(i, 0, n) {
            ans = min(ans, dp[(1 << n) - 1][i] + res[i]);
        }
        ans -= 1e-6;
        cout << (ans <= W ? "OK" : "NA") << endl;
    }

    return 0;
}

