#include <bits/stdc++.h>
using namespace std;
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define rep(i,n)  FOR(i,0,n)
#define req(i,n) for(int i = 1;i <=n;i++)
#define pai 3.14159265358979323846
const int INF = 1001001001;
typedef long long ll;
bool punched[3][3];

//using Graph = vector<vector<int>>;


const int MOD = 1000000007;
typedef pair<int,int> P;

//最大公約数
ll gcd(ll a,ll b){
	if (a%b == 0){
		return b;
	}
	else{
		return gcd(b,a%b);
	}

}

//最小公倍数
ll lcm(ll a,ll b){
	return a /gcd(a,b) * b;
}

//素数判定
bool is_prime(long long N) {
    if (N == 1) return false;
    for (long long i = 2; i * i <= N; ++i) {
        if (N % i == 0) return false;
    }
    return true;
}

// 素因数分解
vector<pair<long long, long long> > prime_factorize(long long n) {
    vector<pair<long long, long long> > res;
    for (long long p = 2; p * p <= n; ++p) {
        if (n % p != 0) continue;
        int num = 0;
        while (n % p == 0) { ++num; n /= p; }
        res.push_back(make_pair(p, num));
    }
    if (n != 1) res.push_back(make_pair(n, 1));
    return res;
}

// 10進数から2進数
int binary(int bina){
    int ans = 0;
    for (int i = 0; bina>0 ; i++)
    {
        ans = ans+(bina%2)*pow(10,i);
        bina = bina/2;
    }
    return ans;
}

//Union-Find
struct UnionFind {
    vector<int> par; // par[i]:iの親の番号　(例) par[3] = 2 : 3の親が2

    UnionFind(int N) : par(N) { //最初は全てが根であるとして初期化
        for(int i = 0; i < N; i++) par[i] = i;
    }

    int root(int x) { // データxが属する木の根を再帰で得る：root(x) = {xの木の根}
        if (par[x] == x) return x;
        return par[x] = root(par[x]);
    }

    void unite(int x, int y) { // xとyの木を併合
        int rx = root(x); //xの根をrx
        int ry = root(y); //yの根をry
        if (rx == ry) return; //xとyの根が同じ(=同じ木にある)時はそのまま
        par[rx] = ry; //xとyの根が同じでない(=同じ木にない)時：xの根rxをyの根ryにつける
    }

    bool same(int x, int y) { // 2つのデータx, yが属する木が同じならtrueを返す
        int rx = root(x);
        int ry = root(y);
        return rx == ry;
    }
};






ll powmod(ll x,ll y){
    ll res=1;
    for(ll i=0;i<y;i++){
        res=res*x%MOD;
    }
    return res;
}


 
bool ok(int v, int b) {
    while (v) {
        if (v % b == 7) return false;
        v /= b;
    }
    return true;
}


int main() {
    int  n;
    cin >> n;
    string s;
    cin >> s;
    int ans = n;

    for (int i = 0;i < s.size() - 2;i++) {
         //cout << i << endl;
        if (s.size()<3) break;
        if (s[i]== 'f' && s[i+1] == 'o' && s[i+2] == 'x') {
            //ans -= 3;
            s.erase(s.begin()+i);
            s.erase(s.begin()+i);
            s.erase(s.begin()+i);
            if (i < 3){
            i = -1;
            }
            else {
                i -= 3;
            }
        }
       
    }
   // cout << s << endl;
    cout << s.size() << endl; 
}

#include<bits/stdc++.h>
#define x first
#define y second
#define all(x) (x).begin(),(x).end()
#define sz(x) (int)(x).size()
#define mem(x,val) memset(x,val,sizeof x)
#define pii pair<int,int>
#define pb emplace_back
#define ar array
#define int long long
#define FOR(i, a, b) for(int i = a; i < b; i++)
#define M 1000000007
#define wopen(x) freopen((x),"w",stdout)
#define ropen(x) freopen((x),"r",stdin)
using namespace std;
const int dx[] = {1, 0, -1, 0}, dy[] = {0, 1, 0, -1};
const int N = 2e5 + 5;

int n, m, top, chose, dp[(1<<18)], group[(1<<18)], st[20];
bitset<20> mat[20];

void init(){
    for(int i = 0; i < (1<<n); i++){
        top = 0;
        for(int j = 0; j < n; j++)
            if((i>>j)&1) st[top++] = j;
        for(int j = 0; j < top; j++)
            for(int k = 0; k < j; k++)
                if(mat[st[j]][st[k]] == 0)
                    goto next;
        group[i] = 1;
        next:;
    }
}

void dfs(int now, int bit){
    if(now == top){
        if(group[bit]) dp[chose|bit] = min(dp[chose|bit], dp[chose] + 1);
        return;
    }
    dfs(now + 1, bit | (1<<st[now]));
    dfs(now + 1, bit);
}

signed main(void){
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin >> n >> m;
    for(int i = 0; i < m; i++){
        int a, b;
        cin >> a >> b;
        a--, b--;
        mat[a][b] = mat[b][a] = 1;
    }
    init();
    mem(dp, 0x3f);
    dp[0] = 0;
    for(int i = 0; i < (1<<n); i++){
        top = 0;
        for(int j = 0; j < n; j++)
            if(((i>>j)&1) == 0) st[top++] = j;
        chose = i;
        dfs(0, 0);
    }
    cout << dp[(1<<n)-1];
}
