#include <bits/stdc++.h>
using namespace std;
const double PI = 2.0 * acos(0.0);
inline int getInt() {
  int x;
  scanf("%d", &x);
  return x;
}
inline long long getLL() {
  long long x;
  scanf("%lld", &x);
  return x;
};
inline int NUM(char c) { return (int)c - 48; }
inline char CHR(int n) { return (char)(n + 48); }
template <class T>
inline T MAX(T a, T b) {
  if (a > b) return a;
  return b;
}
template <class T>
inline T MIN(T a, T b) {
  if (a < b) return a;
  return b;
}
inline void OPEN(string s) {
  freopen((s + ".in").c_str(), "r", stdin);
  freopen((s + ".out").c_str(), "w", stdout);
}
vector<pair<int, int> > PQ;
bool flag[300 + 5];
int N;
int M[300 + 5][300 + 5];
int his[300 + 5];
int prio[300 + 5];
bool can[300 + 5][300 + 5];
int main() {
  scanf("%d", &N);
  for (int i = 0, _n = (N); i < _n; i++)
    for (int j = 0, _n = (N); j < _n; j++) scanf("%d", &M[i][j]);
  for (int i = 0, _n = (N); i < _n; i++) {
    scanf("%d", &his[i]);
    prio[his[i] - 1] = i;
  }
  for (int i = 0, _n = (N); i < _n; i++) {
    PQ.push_back(make_pair(prio[i], i));
    sort((PQ).begin(), (PQ).end());
    for (int j = 0, _n = (N); j < _n; j++) {
      int idx = 0;
      if (PQ[idx].second == j) idx++;
      if (idx >= (PQ).size()) continue;
      int x = PQ[idx].second;
      can[j][x] = true;
    }
  }
  for (int i = 0, _n = (N); i < _n; i++) {
    if (i) printf(" ");
    for (int j = 0, _n = (N); j < _n; j++) {
      int k = M[i][j] - 1;
      if (k != i && can[i][k]) {
        printf("%d", k + 1);
        break;
      }
    }
  }
  puts("");
  return 0;
}
